0 前言
需要字节对齐的根本原因在于CPU访问数组数据的效率问题 ,对于标准数据类型,它的地址只要是它的长度的整数倍就行了,而非标准数据类型按下面的原则对齐:
数组 :按照基本数据类型对齐,第一个对齐了后面的自然也就对齐了。
联合 :按其包含的长度最大的数据类型对齐。
结构体: 结构体中每个数据类型都要对齐。
本文重点分析结构体的对齐方式。
1 结构体
1.1 案例1
struct A {
char a; // 1字节对齐
int b; // 4字节对齐
short c; // 2字节对齐
} a; // 由于本结构体最大的成员是4字节对齐,因此本结构体整体以4字节对齐
字节对齐情况:
sizeof(A) = 12; // struct A以4字节对齐,因此后面补充两个字节
&a.a = 0;
&a.b = 4; // 地址4字节对齐
&a.c = 8;
1.2 案例2
struct A {
char a; // 1字节对齐
short b; // 2字节对齐
int c; // 4字节对齐
};
字节对齐情况:
sizeof(A) = 8;
&a.a = 0;
&a.b = 2; // 地址2字节对齐
&a.c = 4; // 地址4字节对齐
2 压缩
gcc/g++可通过__attribute__((packed))设置对齐方法:
#include <stdint.h>
struct A {
uint16_t cmd;
uint32_t size;
} __attribute__ ((packed));
int main(void)
{
printf("sizeof(A) = %d\n", sizeof(A));
}
如上所示,添加了__attribute__((packed))后,A占用的空间为6字节,而不是8字节。
参考资料
[1]C语言字节对齐
[2]5分钟搞定内存字节对齐