0
点赞
收藏
分享

微信扫一扫

结构体的内存对齐

蓝莲听雨 2022-03-26 阅读 49
c语言

内存对齐的规则如下:

1. 第一个成员在与结构体变量偏移量为 0 的地址处。

2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。

对齐数 = 编译器默认的一个对齐数 与 该成员大小的 较小值

VS 中默认的值为 8

3. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。

4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整

体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

struct S1
{	
 char c1;
 int i;
 char c2;
};//1+3+4+1+3=12

int main()
{
	printf("%zd\n", sizeof(struct S1));
}

 在举一个嵌套结构体的例子:

struct S3
{
	double d;
	char c;
	int i;
};//8+1+3+4=16
	//练习4-结构体嵌
struct S4
{
	char c1;
	struct S3;
	double a;
};//1+7+16+8=32
int main()
{
	printf("%zd\n", sizeof(struct S3));
	printf("%zd\n", sizeof(struct S4));


}

S3中的最大对齐数是double字节是8,所以里面嵌套的struct S3放在内存偏移量为8的位置。

 vs的默认对齐数是8,我们可以修改对齐数。

#pragma pack(4)//设置默认对齐数为4
struct S3
{
	char c;
    double d;
	int i;
}; 
#pragma pack()//还原默认对齐数

如果默认对齐数是8,结构体大小是1+7+8+4+4=24

修改默认对齐数为4,结构体大小是1+3+8+4=16                                

举报

相关推荐

0 条评论