C/C++--->结构体内存对齐详解
程序员文章站
2022-07-12 16:49:17
...
- 对齐规则
(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字节。
小结:
- 在使用结构体的时候,占用空间小的元素应集中在一起可以节省内存
- 结构体嵌套,最大对其数为这两个结构体中的最大对其数较大的那个