结构体字节对齐

1 结论 与 验证

1,结构体定义的时候,变量成员的顺序会影响结构体的大小;
2,对齐:成员变量以什么样的方式,排列;紧密排列、还是松散中间是不是有间隔;
3,编译器对于对齐方式,可以选择的。vs默认是8字节对齐的。
4、int类型:4字节,如果编译设置的对齐方式,大于4字节,那么就必须以字节的倍数分配地址,对齐方式>=4字节的时候,如果结构体里面,有int,那么结构体的大小,就是4的整数倍。
5、如果short、double,同样的道理;
6、如果有相同类型的变量呢,一定要放在一起,会减小结构体的空间;
7、结构体定义,变量类型从小到大的顺序比较合适;
(从小到大==从大到小,都是最节省空间);大小混着放,占用空间很大;
8、定义结构体,主要是人更容易理解的方式定义。

size = 8在这里插入图片描述
size = 12
在这里插入图片描述
size = 16
在这里插入图片描述
size = 12
在这里插入图片描述
size = 16
在这里插入图片描述
size = 24
在这里插入图片描述

struct s1 {//8
	char c1;
	char c2;
	int a;
};

struct s2 {//12
	char c1;
	int a;
	char c2;
};

struct s3{//16
	char arr[5];
	int a;
	short b;
};

struct s4 {//12
	char arr[5];
	short b;
	int a;
};
struct s5 {//16
	char a;
	char b;
	double c;
};

struct s6 {//24
	char a;
	double c;
	char b;
};
struct s7 {//16
	double a;
	char c;
	char b;
};

struct s8 {//24
	char a;
	short b;
	int c;
	float d;//4
	double e;
};

struct s9 {//32
	char a;
	double e;
	short b;
	int c;
	float d;
	
};
struct s10 {//24
	double e;
	float d;
	int c;
	short b;
	char a;
};
void test1() {
	cout << sizeof(struct s1) << " " << sizeof(struct s2) << endl;
	cout << sizeof(struct s3) << " " << sizeof(struct s4) << endl;
	cout << sizeof(struct s5) << " " << sizeof(struct s6) << " " << sizeof(struct s7) << endl;
	cout << sizeof(struct s8) << " " << sizeof(struct s9) << " " << sizeof(struct s10)<<endl;
}

(从小到大==从大到小,都是最节省空间);大小混着放,占用空间很大;
在这里插入图片描述

2 设置对其字节数

编译器对于对齐方式,可以选择的。vs默认是8字节对齐的。在这里插入图片描述
可以程序设置对其字节数
pragma /pˈræɡ mə/ n.编译指示;杂注

#pragma pack(1)  //设置字节对齐数为1字节,此时与大小顺序无关,紧密排列

在这里插入图片描述

//4字节对齐
#pragma pack(4) 

在这里插入图片描述

//8字节对齐
#pragma pack(8) 

在这里插入图片描述

3 什么时候修改对齐设置

在这里插入图片描述
·嵌入式环境
·VR
·特定系统环境
等这些内存比较小的场合,否则不要随意修改,否则在不同系统运行效果会不一样。

4 结构体嵌套

//结构体B嵌套结构体A,结构体A存储起点为A内部最大成员整数倍的地方。
//(struct B里存有struct A,A里有char,int,double等成员,那A应该从8的整数倍开始存储。)

//结构体嵌套

//结构体B嵌套结构体A,结构体A存储起点为A内部最大成员整数倍的地方。
//(struct B里存有struct A,A里有char,int,double等成员,那A应该从8的整数倍开始存储。)
struct s11 {//8
	char c1;
	char c2;
	int a;
};

struct s12 {//24
	char c1;//4
	s11 d; //从第4开始,d内部最大成员int,d的起点以4的倍数开始,所以前面4字节全部给char c1;
	int a;
	double c2;
};

struct s13 {//24
	char c1;
	double c2;
	int a;
};

struct s14 {//48
	char c1;//8
	s13 d;//从第8开始,d内部最大成员double,d的起点以8的倍数开始,所以前面8字节全部给char c1;
	int a;
	double c2;
};

struct s15 {//8
	char c1;
	char c2;
	int a;
};

struct s16 {//16
	char c1;
	int a;
	s15 d; //从第8开始
};
void test2() {
	cout << sizeof(struct s11) << " " << sizeof(struct s12) << endl;
	cout << sizeof(struct s13) << " " << sizeof(struct s14) << endl;
	cout << sizeof(struct s15) << " " << sizeof(struct s16) << endl;
}

在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

R-G-B

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值