c++对齐方式总结(上)

本文介绍了C++中结构体的对齐规则,包括数据成员对齐、结构整体对齐和含有对象组合的对齐。通过实例展示了不同对齐系数下结构体占用内存的情况,深入理解内存布局和编译器的内存分配策略。

发现从网上获得的这些信息上受益匪浅,同时感慨人家怎么那么牛,不仅技术牛,而且文章写的也好呢!真是自叹不如,同时也想实践一下,记录一下自己的学习心得,练练自己的文笔,不求能帮得上大家,但求能在这个网上结识一些朋友,大家互相学习,共同进步

编译器要对c++代码进行编译时需要按照相应的类型为变量分配内存空间,最为人们熟知的就是那五个空间了:栈,堆,全局数据区,常量区和代码区。现在知道了哪些变量存放在哪些空间里了,但是在相应的空间里又是如何存放的呢?相信很多人都已经知道了,我也知道了。

对齐方式有三种规则,看网上已经很详细了,我还是想用自己的话再说一遍吧:

 

 

 

下面用网上的例子和我的改进加以说明

试验:通过#pragma pack(n)改变“对齐系数”,然后察看sizeof(struct test_t)的值。

 1字节对齐(#pragma pack(1))

输出结果:sizeof(struct test_t) = 8

分析过程:

1) 成员数据对齐

#pragma pack(1)

struct test_t {

 int a;  /* 长度4 > 1 1对齐;起始offset=0 0%1=0;存放位置区间[0,3] */

 char b;  /* 长度1 = 1 1对齐;起始offset=4 4%1=0;存放位置区间[4] */

 short c; /* 长度2 > 1 1对齐;起始offset=5 5%1=0;存放位置区间[5,6] */

 char d;  /* 长度1 = 1 1对齐;起始offset=7 7%1=0;存放位置区间[7] */

};

#pragma pack()

成员总大小=8

 2) 整体对齐

整体对齐系数 = min((max(int,short,char), 1) = 1

整体大小(size)=$(成员总大小 $(整体对齐系数圆整 = 8 /* 8%1=0 */ [1]

 

2字节对齐(#pragma pack(2))

输出结果:sizeof(struct test_t) = 10

分析过程:

1) 成员数据对齐

#pragma pack(2)

struct test_t {

 int a;  /* 长度4 > 2 2对齐;起始offset=0 0%2=0;存放位置区间[0,3] */

 char b;  /* 长度1 < 2 1对齐;起始offset=4 4%1=0;存放位置区间[4] */

 short c; /* 长度2 = 2 2对齐;offset 需要按照原则1自增,直到起始offset=6 6%2=0;存放位置区间[6,7] */

 char d;  /* 长度1 < 2 1对齐;起始offset=8 8%1=0;存放位置区间[8] */

};

#pragma pack()

成员总大小=9

2) 整体对齐

整体对齐系数 = min((max(int,short,char), 2) = 2

整体大小(size)=$(成员总大小 $(整体对齐系数圆整 = 10 /* 10%2=0 */

 

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

 

输出结果:sizeof(struct test_t) = 12

分析过程:

1) 成员数据对齐

#pragma pack(4)

struct test_t {

 int a;  /* 长度4 = 4 4对齐;起始offset=0 0%4=0;存放位置区间[0,3] */

 char b;  /* 长度1 < 4 1对齐;起始offset=4 4%1=0;存放位置区间[4] */

 short c; /* 长度2 < 4 2对齐;起始offset=6 6%2=0;存放位置区间[6,7] */

 char d;  /* 长度1 < 4 1对齐;起始offset=8 8%1=0;存放位置区间[8] */

};

#pragma pack()

成员总大小=9

 2) 整体对齐

整体对齐系数 = min((max(int,short,char), 4) = 4

整体大小(size)=$(成员总大小 $(整体对齐系数圆整 = 12 /* 12%4=0 */

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值