您的位置:首页 > 运维架构

释析#pragma pack(push,n) #pragma pack(n) #pragma pack() #pragma pack(pop)

2015-08-09 17:22 483 查看
今天阅读别人写得的代码时,发现了#pragma pack(n) 这段代码,不知道加这个代码是什么个意思,然后自己就查了一下资料,然后写了段代码试了试,还有点那么个意思,

含义是:告诉编译器设置结构体的边界字节对齐方式,也就是所有数据在内存中是存储的方式
这句话挺模糊的, 我们接下来先看几个例子程序,

例子一
struct weikangc
{
int nAge;
char cSex;
};

int main(int argc, char* argv[])
{
printf("%d\r\n",sizeof(weikangc));
return 0;
}
对于结构在内存当中默认的对齐为:结构体各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为整数倍

所以在这个例子当中输出结果是sizeof(weikangc)=8,而不是5.

#define MEMTYPE 1;

#pragma pack(MEMTYPE)
struct weikangc
{
int nAge;
char cSex;
};

#pragma pack()

int main(int argc, char* argv[])
{

printf("%d\r\n",sizeof(weikangc));

return 0;
}
这个例子当中,使用了#pragma pack(MEMTYPE),消息默认的对齐方式,使用设置的1个字节对齐方式,即结构体的各成员变量在内存当中是连续存储的。

所以在这个例子当中输出结果是sizeof(weikangc)= 5,然不是上个例子中的8了,哈哈,我们可以控制编译器的结构的默认对齐方式的。

#pragma pack(push,4)
#pragma pack(2)

struct weikangc
{
int nAge;
char cSex;
};

#pragma pack()
#pragma pack(pop)

int main(int argc, char* argv[])
{

printf("%d\r\n",sizeof(weikangc));
return 0;
}
我们嵌套使用了#pragma pack() ,对于编译器而言,将会以最外层的对齐方式为准,所以这个例子输出结果为 sizoef(weikangc) = 8

那#pragma pack(push,1)和#pragma pack(1)有什么区别呢,

#pragma pack (n) 作用:C编译器将按照n个字节对齐。

#pragma pack () 作用:取消自定义字节对齐方式。

#pragma pack (push,1) 作用:是指把原来对齐方式设置压栈,并设新的对齐方式设置为一个字节对齐

#pragma pack(pop) 作用:恢复对齐状态

其实两者区别不大,网上说前者更优 ,以上是转载一个很详细的解释哈。

//////////////////////////////////////////////开始转载///////////////////////////////////////////////////////////////////

#pragma pack (n) 作用:C编译器将按照n个字节对齐。

#pragma pack () 作用:取消自定义字节对齐方式。

#pragma pack (push,1) 作用:是指把原来对齐方式设置压栈,并设新的对齐方式设置为一个字节对齐

#pragma pack(pop) 作用:恢复对齐状态

因此可见,加入push和pop可以使对齐恢复到原来状态,而不是编译器默认,可以说后者更优,但是很多时候两者差别不大

如:

#pragma pack(push) //保存对齐状态

#pragma pack(4)//设定为4字节对齐

相当于 #pragma pack (push,4)

#pragma pack (1) 作用:调整结构体的边界对齐,让其以一个字节对齐;<使结构体按1字节方式对齐>

#pragma pack ()

例如:

#pragma pack(1)

struct sample

{

char a;

double b;

};

#pragma pack()

注:若不用#pragma pack(1)和#pragma pack()括起来,则sample按编译器默认方式对齐(成员中size最大的那个)。即按8字节(double)对齐,则sizeof(sample)==16.成员char a占了8个字节(其中7个是空字节);若用#pragma pack(1),则sample按1字节方式对齐sizeof(sample)==9.(无空字节),比较节省空间啦,有些场和还可使结构体更易于控制。

//////////////////////////////////////////////结束转载///////////////////////////////////////////////////////////////////
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: