关于C语言对齐的一些总结

电子说

1.4w人已加入

描述

1. 对齐的目的是什么?

  • 提供访问效率---放大对齐
  • 压缩存储空间---紧凑对齐

2. 对齐的类型有哪些?

  • 自然对齐 :结构体默认按最大基础类型成员的大小对齐(比如最大成员是int(4字节),就按 4 字节对齐);
  • 强制对齐 :用__attribute__((aligned(n)))(GCC/Clang)或#pragma pack(n)(MSVC/GCC)指定对齐值n(必须是 2 的幂:1/2/4/8/16...)。

3. 对齐的规则是什么?

  • 使用packed#pragma pack(n) 时,影响结构体对齐、大小和成员对齐。结构体每个成员必须按自身大小强制对齐值中的较小值对齐;
  • 使用aligned(n) 时,只影响结构体对齐和大小,不影响成员对齐
  • 使用aligned(n) 时,结构体总大小必须是 max(最大成员对齐,aligned(n)) 的整数倍(不足则填充字节);
  • 使用aligned(n) 时,结构体对齐取 max(最大成员对齐,aligned(n))
struct Test1 {
    char a; // 按min(1, 1)=1对齐,起始地址0
    short b; // 按min(2,1)=1对齐,起始地址1 
    int c; // 按min(4,1)=1对齐,起始地址3
} __attribute__((packed));

// Test1的起始地址对齐1字节, 比如0,1,2...
// Test1的总大小是1的整数倍,等于7

struct Test2 {
    char a; // 按min(1, 8)=1对齐,起始地址0
    short b; // 按min(2,8)=2对齐,起始地址2
    int c; // 按min(4,8)=4对齐,起始地址4
} __attribute__((aligned(8)));

// Test2的起始地址对齐max(4,8)=8字节,比如0,8,16...
// Test2的总大小是8的整数倍,等于8

4. 对齐的方法有哪些?

指令作用适用场景
__attribute__((aligned(n)))放大对齐 (不能小于自然对齐)缓存对齐、硬件要求
__attribute__((packed))缩小对齐 (1 字节紧凑)网络协议、节省内存
#pragma pack(n)全局修改对齐规则跨编译器兼容(MSVC/GCC)

5. 使用typedef定义的结构体类型如何对齐?

typedef struct {
char a;
int  b;
} __attribute__((packed)) TestType;  // ✅ 正确:放在结构体末尾

6. typedef结构体类型定义的变量也会保持对齐吗?

  • 是的
// 1. typedef + packed:定义“紧凑对齐的结构体类型”
  typedef struct {
  char a;    // 1
  int  b;    // 4
  } __attribute__((packed)) MyType;

// 2. 用这个别名定义变量
MyType data;

// 结果:
// sizeof(MyType) = 5 字节(1+4,无填充)
// data 这个变量,内存布局也是紧凑无填充的

7. __attribute__((aligned(n)))对数组的影响

  • 影响数组的起始地址对齐总大小 ,不影响数组元素对齐。

审核编辑 黄宇

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 相关推荐
  • 热点推荐
  • C

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分