结构体内存对齐
下面通过一段代码比较来看
struct S1 { char c1; int i; char c2; }; struct S2 { char c1; char c2; int i; }; struct S3 { double d; char c; int i; }; struct S4 { char c1; struct S3 s3; double d; }; int main() { cout << sizeof(S1) << endl;//12 cout << sizeof(S2) << endl;//8 cout << sizeof(S3) << endl;//16 cout << sizeof(S4) << endl;//32 return 0; }
似乎结构体的大小并不是结构体类每个成员大小之和,
这里我们就要涉及到结构体的内存对齐。
如何计算?
对齐规则
1.第一个成员在与结构体变量偏移量为0的地址处。
2.其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
VS中默认的值为8
Linux中没有默认对齐数,对齐数就是成员自身的大小
可与使用#pragma去修改默认对齐数
3.结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
4.如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整
体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍
为什么对有内存对齐
大概就是,结构体的内存对齐是拿空间来换取时间的做法。
那在设计结构体的时候,我们既要满足对齐,又要节省空间,如何做到:
让占用空间小的成员尽量集中在一起。
eg:
struct S1 { char c1; int i; char c2; };//12 struct S2 { char c1; char c2; int i; };//8
S1和S2类型的成员一模一样,但是S1和S2所占空间的大小有了一些区别.