关于C语言对齐的一些总结 电子说
int(4字节),就按 4 字节对齐);__attribute__((aligned(n)))(GCC/Clang)或#pragma pack(n)(MSVC/GCC)指定对齐值n(必须是 2 的幂:1/2/4/8/16...)。影响结构体对齐、大小和成员对齐。结构体每个成员必须按自身大小和强制对齐值中的较小值对齐;只影响结构体对齐和大小,不影响成员对齐;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
| 指令 | 作用 | 适用场景 |
|---|---|---|
__attribute__((aligned(n))) | 放大对齐 (不能小于自然对齐) | 缓存对齐、硬件要求 |
__attribute__((packed)) | 缩小对齐 (1 字节紧凑) | 网络协议、节省内存 |
#pragma pack(n) | 全局修改对齐规则 | 跨编译器兼容(MSVC/GCC) |
typedef struct {
char a;
int b;
} __attribute__((packed)) TestType; // ✅ 正确:放在结构体末尾
// 1. typedef + packed:定义“紧凑对齐的结构体类型”
typedef struct {
char a; // 1
int b; // 4
} __attribute__((packed)) MyType;
// 2. 用这个别名定义变量
MyType data;
// 结果:
// sizeof(MyType) = 5 字节(1+4,无填充)
// data 这个变量,内存布局也是紧凑无填充的
__attribute__((aligned(n)))对数组的影响审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !