欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

#Pragma Pack(n)与内存分配 pragma pack(push,1)与#pragma pack(1)的区别

程序员文章站 2022-05-05 10:05:12
...

        在网络协议编程中,经常会处理不同协议的数据报文。一种方法是通过指针偏移的方法来得到各种信息,但这样做不仅编程复杂,而且一旦协议有变化,程序修改起来也比较麻烦。在了解了编译器对结构空间的分配原则之后,我们完全可以利用这一特性定义自己的协议结构,通过访问结构的成员来获取各种信息。这样做,不仅简化了编程,而且即使协议发生变化,我们也只需修改协议结构的定义即可,其它程序无需修改,省时省力。

#pragma  pack (1) //设定为1字节对齐           作用:调整结构体的边界对齐,让其以一个字节对齐;<使结构体按1字节方式对齐>
#pragma pack(push) //保存当前对齐状态
#pragma pack(4)    //设定为4字节对齐
#pragma  pack () //按结构数据内最大的字节对齐
#pragma  pack(push,1)//把原来对齐方式压栈,并设置新的对齐方式为1个字节对齐
#pragma  pack(pop)  //恢复默认对齐方式

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

例子:

struct data
{
char a;
double b;
};

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

        举例说明:

例子1:

#pragma pack(1)

struct node{

  char f;
  int e;
  short int a;
  char b;};

struct node n;

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

按一字节对齐,不考虑补齐对齐,结构体所占大小为8。

例子2:

#pragma pack(2)

struct node{

  char f;
  int e;
  short int a;
  char b;};

struct node n;

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

按2字节对齐,考虑补齐对齐,结构体所占内存大小为10.

例子3:

#pragma pack(4)

struct node{

  char f;
  int e;
  short int a;
  char b;};

struct node n;

printf("%d\n",sizeof(n));
按4字节对齐,考虑补齐对齐,结构体所占内存大小为12。


相关标签: #pragma pack