#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()设定值的整数倍数)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)