关于c++ 中 #pragma pack(n)用法

关于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()设定值的整数倍数)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值