[C++]宏定义字节对齐#PragmaPack/Pop

#Pragma Pack (n)    //指定对齐的字节数
...
#pragma pop  (pop)  //恢复对齐状态,默认4字节对齐

目录

什么是对齐

对齐规则

功能

应用


什么是对齐

现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。

对齐规则

结构体中各个成员按照它们被声明的顺序在内存中顺序存储。

  1. 将结构体内所有数据成员的长度值相加,记为sum_a; 
  2. 将各数据成员内存对齐,按各自对齐模数而填充的字节数累加到和sum_a上,记为sum_b。对齐模数是【该数据成员所占内存】与【#pragma pack指定的数值】中的较小者。
  3. 将和sum_b向结构体模数对齐,该模数是【#pragma pack指定的数值】、【未指定#pragma pack时,系统默认的对齐模数8字节】和【结构体内部最大的基本数据类型成员】长度中数值较小者。结构体的长度应该是该模数的整数倍。
  4. 静态变量的存放位置与结构体实例的存储地址无关,是单独存放在静态数据区的,因此用siezof计算其大小时没有将静态成员所占的空间计算进来。这一点对类和结构体都适用。
  5. 普通函数:不占用内存;虚函数:要占用4个字节,用来指定虚函数的虚拟函数表的入口地址。子类与父类共享虚函数入口地址。

设想

不同平台在内存处理和读取顺序上不一致,不对这种情况作出预防措施,可能会失存取效率。这也是时间空间复杂度方面的习惯把握。

假设存在平台读取数据起点为奇/偶地址,可能会多余一个时间周期,并且增加高低地址拼接操作。

应用

在结构体前加上#Pragma Pack(1),以一个字节对齐,使用完后要加#pragma pack(),释放内存对齐。

打比方,现在是windows10 x64的机器,理论上结构体占据空间30字节,打印结果为40。

而当声明了1字节对齐后

所有示例可在git仓库内下载,learnProject/csdnExample at main · 1900Linz/learnProject · GitHub

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值