pragmapack:#pragma pack 和 sizeof

#pragma 是个预处理指令其中#pragma pack指令直接影响到个结构体、联合体、类内存布局那么它是如何影响首先我们来看两个类

#pargam pack(8)

struct TEST1

{

char v[9];

x;

};



struct TEST2

{

char v[9];

long long x;

};



请问(TEST1)和(TEST2)值是多少?如果当第指令改成#pargam pack(1)哪么又应该是多少呢,呵呵如果你能马上正确答出这几个问题我想你定对下面计算方式了如指掌

对齐参数 指某个变量在内存中起始位置是对齐参数整数倍对于给定#pargma pack(n)n可以是集合中{124816}中个值

步:第个成员总是从零开始对齐

第 2步:计算每个成员对齐参数

对于个简单类型成员每种类型有个基本对齐参数(ba)也就是如 char 是 1 是4对于简单类型变量其对应对齐参数和其简单类型相同然后比n比较取较小值为该成员实际对齐参数b

对于复合类型成员如结构体对象成员取该结构体所有成员变量中最大对齐参数作该成员实际对齐参数b

第 3步:结构体总尺寸应为 所有成员中最大对齐参数整数倍



了解了计算思路方法我们来看下具体例子

#pargam pack(8) // 也是默认对齐方式

struct TEST1

{

char v[9]; //实际对齐参数是 1

x; //实际对齐参数为4

};

个成员有9个char值x要从4倍数开始所以填充了 3个

所以计算总尺寸为9+3+4 = 16 ,而16正好是4倍数所以(TEST1)=16

#pargam pack(8) // 也是默认对齐方式

struct TEST2

{

char v[9]; //实际对齐参数是 1

long long x; //实际对齐参数为8

};

而对于TEST2而言X对齐参数为8 所以要填充7个作为

所以总尺寸为 9+ 7+ 8 =24 正好是8倍数所以(TEST2)=24

当TEST2对齐条件改成了

#pargam pack(4)

那么 成员 x 实际对齐参数就是4 基本对齐参数和 n最小值

所以只要填充3个字节所以总尺寸变成了 9+ 3+ 8 =20 正好是4倍数

所以现在(TEST2)=20



我们看个更复杂例子如下

#pragma pack(4)

struct TEST1

{

char a[9];

long long s;



};



struct TEST2

{

char a;

TEST1 test;



};



由上个例子我们知道(TEST1)=20,哪么现在(TEST2)是多少?根据前面所说计算方式对于复杂类型成员按其复杂类型最大对齐参数计算在这里是S对齐尺寸是4因此 (TEST2) = 24;



更极端例子如果TEST1和TEST2它们对齐条件不情况下会是如何呢

#pragma pack(2)

struct TEST1

{

char a[9];

long long s;



};

#pragma pack



#pragma pack(4)

struct TEST2

{

char a;

TEST1 test;



};

#pragma pack



我不给出答案你可以找个工具编译运行想想这是为什么?
Tags:  pragma pragmapackpop pragmapackpush pragmapack

延伸阅读

最新评论

发表评论