CC++--->结构体内存对齐详解

it2026-08-30  0

对齐规则 (1) 第一个成员在与结构体变量偏移为0的地址处. (2) 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。 对齐数:编译器默认的一个对齐数与该成员大小的较小值(vs中默认值为8,Linux中默认值为4)。 (3) 结构体总大小为最大对齐数的整数倍。 最大对齐数:结构体的每个成员变量都有一个对齐数(该类型的大小),取最大。 (4) 如果嵌套了结构体的情况,嵌套的结构体对齐到自己成员最大对齐数的整数倍,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。 #include <iostream> using namespace std; struct S1 { char c1; int i; char c2;//8 }; struct S2 { char c1; char c2; int i;//8 }; struct S3 { double d; char c; int i;//16 }; struct S4 { char c1; struct S3 s3; double d;//32 }; int main() { cout << sizeof(struct S1) << endl; cout << sizeof(struct S2) << endl; cout << sizeof(struct S3) << endl; cout << sizeof(struct S4) << endl; system("pause"); }

上图结构体S1:char c1从0偏移开始,占一个字节;接下来存int i,由于1不是4的整数倍,所以向后偏移2,3都不是4的倍数,4是4的倍数,故i从4开始储存,占用4,5,6,7偏移;现在可用偏移为8偏移是1的整数倍,char c2存放于9偏移;9不是最大对齐数4的整数倍,向后偏移10,11都不是,12偏移是4的整数倍,故结构体S1的大小为12字节。

小结:

在使用结构体的时候,占用空间小的元素应集中在一起可以节省内存结构体嵌套,最大对其数为这两个结构体中的最大对其数较大的那个
最新回复(0)