关于c++ 中 #pragma pack

关于c++ 中 #pragma pack,第1张

关于c++ 中 #pragma pack(n)用法
#pragma pack(4)
class TestC
{
public:
	char a;//第一个成员,自身长1,#pragma pack(4),取1,按照1字节对齐,放在[0]偏移的位置,
	short b;;//第二个成员,自身长2,#pragma pack(4),取2,按照2字节对齐,放在偏移[2,3]的位置。


char c;//第三个,自身长为1,#pragma pack(4),取1,按照1字节对齐,放在[4]的位置。


}; int main() { TestC test; int nSize = sizeof(test); cout<<nSize<<endl;//nSzie = 6 return true; }

#pragma pack规定的对齐长度 针对结构,联合,或者类的数据成员,第一个放在偏移为0的地方,以后每个数据成员的对齐,按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。


也就是说 ,当#pragma pack的值等于或超过所有数据成员长度的时候,这个值的大小将不产生任何效果。


而结构整体的对齐,则按照结构体中最大的数据成员 和 #pragma pack指定值n之间,较小的那个进行。


回到代码,a按照1字节对齐,其实就是第一个位置,[0],b按2字节对齐,以[1]为第一个,从第二个位置开始,[2][3],c按照1字节对齐,以[4]为第一个,从第1个位置开始,[4],这样类本身占5个字节,按照min(sizeof(short),4)字节对齐,也就是2字节对齐,即[0][1],[2][3],[4][5],为了使得最后2个字节对齐,补一个字节[5],整个类共计6个字节,(最终的大小一般为欸pack()设定值的整数倍数)

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/568746.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-09
下一篇 2022-04-09

发表评论

登录后才能评论

评论列表(0条)

保存