结构体字节对齐

阅读量: 96 编辑

程序案例1:结构体占内存的字节大小

#include <iostream>
using namespace std;

struct student{
	char a;
	int no;
	double score;
};

int main(){
	student s;
	cout << sizeof(s.a) << endl; 	//1
	cout << sizeof(s.no) << endl; 	//4
	cout << sizeof(s.score) << endl;//8
	
	cout << sizeof(s) << endl; 		//16
	
	return 0;
} 

结构体中元素按照定义顺序依次置于内存中,但并不是紧密排列。

规则一:

从结构体首地址开始依次将成员放入内存时,成员会被放置在其自身对齐大小的整数倍地址上。

1576461718781984.png

在 a 后面补齐3个字节,对齐int类型。所以结果是:16。

案例2:下面这段程序呢?

struct student{
	char a;
	double score;
	int no;
};

我们发现此时结构体的大小并不是20而是24,那么多出来的这4个字节如何解释?我们引出第二条规则。

规则二:

如果结构体大小不是所有成员中最大对齐大小的整数倍,则结构体对齐到最大成员对齐大小的整数倍,填充空间放置到结构体末尾。

1576461804765216.png

案例3:

struct student{
	double score;
	char a;
	int no;
	char c;
};

是多少?这个结果就是 24。

数组

struct student{
	double score;
	char a[5];
	int no;
};

参考规则二,在尾部补齐8的整数倍,结果是24

struct student{
	char a;			//1+3
	int no[3];		//12
	double score;	//8
};

参考规则一,a后面补齐,结果是24

如果no[4],还要参考规则一,结果是32

指针

struct student{
	char a;			//1+3
	int no;			//4
	int *score;		//8(64位系统)
};

指针类型是地址,根据系统确定,如果是64位,就占8个字节,如果是32位就占4个字节。

参考规则一,结果是 16。

爱码岛编程公众号
微信扫码关注
爱码岛编程小程序
微信扫码打开
苏ICP备13052010号
©2023 南京匠成信息科技有限公司