C++ struct结构内存布局

212 阅读2分钟

C++中,结构在内存里存放的时候会有对齐问题,对齐尺度为当前扫描到的最长数据类型的长度。

以下操作环境为64位机器,linux系统,g++编译器。

示例1: struct A{ char a , int b };

当前长度:0 ,对齐尺度:0
扫描到char a ,char类型长度1>0(对齐尺度)为true,对齐尺度 = sizeof(char) == 1;当前长度为0不需要对齐,当前长度+=1 == 1;
扫描到int b ,int类型长度4>1(对齐尺度)为true,对齐尺度 = sizeof(int) == 4;当前长度为1需要对齐,以4对齐需要添加3字节,当前长度+=3 == 4 ,对齐完毕,再添上int b 的长度 当前长度+=4 == 8。
sizeof(A) == 8。

image.png

image.png

示例2:struct B{ char a , char b , int c };

当前长度:0 , 对齐尺度:0
扫描到char a ,char类型长度1>0(对齐尺度)为true,对齐尺度 = sizeof(char) == 1;当前长度为0不需要对齐,当前长度+=1 == 1;
扫描到char b ,char类型长度1>1(对齐尺度)为false,对齐尺度不变;当前长度为1不需要对齐,当前长度+=1 ==2;
扫描到int c ,int类型长度4>1(对齐尺度)为true,对齐尺度 = sizeof(int) == 4;当前长度为2需要对齐,以4对齐需要添加2字节,当前长度+=2 == 4,对齐完毕,再添上int c 的长度,当前长度+=4 == 8。

image.png

image.png

示例3:struct C{ char a, int b , char c , double d};

有些文章上面写结构按照结构中元素长度最大的元素的长度进行对齐,按照这种思路,结构体C中最长元素为d,长度为sizeof(double) == 8,这么算应该是16字节,a、b、c三个加起来6字节,对齐2字节,加上d的8字节一共16字节,但是打印sizeof(C)实际上是24字节:

image.png

image.png

所以g++编译器应该是我这种算法,按扫描到的最长数据类型的长度计算,在扫描到abc的时候,最长数据类型是b的int.