0%

结构体内存对齐wenti

在 C 语言中,结构体的对齐方式是编译器根据平台和编译器的要求进行的一种内存对齐操作,其目的是为了提高内存访问的效率和性能。对齐方式可以通过编译器的选项或者特定的编译指令来控制,但通常情况下编译器会使用默认的对齐方式。

遵循的一般对齐规则:

  • 每个成员变量的起始地址都必须是其数据类型大小的倍数,如果不能则在前一个成员后面补充字节,默认的对齐大小是4:这意味着一个 int 类型的变量通常会从内存地址为 0、4、8、12 等处开始,而一个 double 类型的变量通常会从内存地址为 0、8、16、24 等处开始。
  • 结构体的总大小必须是其最大成员变量大小的倍数

例如下面这个例子:

1
2
3
4
5
struct A{
int a;
double b;
char c;
};

假设a的起始地址是0x0000,则a所占的内存空间为0x00000x0003,下一个地址0x004不是double的大小8的整数倍,故补零到0x0007。则b的内存为0x00080x0010。下一个地址0x0011为c的地址。共8+8+1=17字节,但总大小不是最大数据类型大小8的整数倍,故总大小为24。

而下面的例子:

1
2
3
4
5
struct A{
char a;
int b;
double c;
};

假设a的地址:0x00000x0001,下一个地址0x0002不是int大小4的整数倍,故b的地址:0x00040x0007,c的地址:0x0008~0x0010,共4+4+8=16个字节,且是最大数据类型大小8的整数倍,故总大小为16。