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

#pragma对struct结构体占用字节的计算

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

一、struct占用字节解释

编译器为了节省计算机读取次数,因为每读一次都需要一次时间,所有需要尽量每次都能高效的读。

优化原则:

1、struct结构体是按照里面成员最大值(下面简称MAX)来作为对其标准的。

2、不够MAX的需要用空占位。

3、比MAX小的成员如果相邻并切和小于等于MAX,则可以相连占位。

struct tmp {
  char a;
  char c;
  short b;
  int d;
};

这个struct在用sizeof()计算大小时,结果是8字节。

前面两个char是2个字节,short是2个字节,int4个字节,正好按4字节对齐就是8字节。

为什么要按4字节对其呢??因为这是为了方便计算机在每次读取一个结构时减少读取的次数,这样两次就能读取完这个结构体,并且每次多去都是有效数据。

struct tmp {
  char a;
  char c;
  int d;
  short b;
};

sizeof()结果是12。

如果结构体重的位置换一下,换成int的4字节在中间,这样编译器还是为了计算机读取方便,前两个char需要占4字节,后面空两个字节,int占4字节,short也占4字节,这样其实是用空间换时间。1/1/00/1111/11/00

再看一个:

struct tmp {
  char a;
  char c;
  int d;
  short b;
  long long e;
};

这个sizeof()是多少呢?

答案是24。   

char/char/int  /short      /long long

10  /10    /1111 /11000000/11111111

二、#pragma对struct占字节影响

#pragma可以按照自己的想法优化对其方式,#pragma pack(n) n只能是1、2、4、8、16等2的幂次方,如果有其他数字会报警告但是不会报错,编译器会自动向上去最近的数。比如写3,就是取4。

编译器优化原则:

{这个目前我还没有非常准确的描述,只是按照理解和看到其他人的解释加以整理得到的}

1、每个结构体成员的占位优化规则都是根据#pragma来优化

2、同时也适用原来struct优化的第三条。(请看上面第三条)

直接看例子吧

1)

#pragma pack(2)
struct tmp {
  char a;
  char c;
  short b;
  int d;
};
#pragma pack()

这个sizeof()是8,1/1/11/1111,这个刚好前两个char是2,short是2,最后一个int是4字节

换一下位置:

#pragma pack(2)
struct tmp {
  char a;
  short b;
  char c;
  int d;
};
#pragma pack()

sizeof() 是2+2+2+4 = 10

10/11/10/1111

这就说明所有成员都是按照2来对齐的,没有管原来的最大长度int是四字节了。

struct tmp {
  char a;
  short b;
  int d;
  char c;
};

#pragma pack(1)
struct tmp1 {
  char a;
  char c;
  short b;
  int d;
  tmp e;
};
#pragma pack()

sizeof(tmp1)的长度是20,这个里面包含了一个tmp e,他的长度是按照tmp自己的对其来的,不会受tmp1的对其方式约束。

#pragma pack(1)
struct tmp {
  char a;
  short b;
  int d;
  char c;
};
#pragma pack()

#pragma pack(1)
struct tmp1 {
  char a;
  char c;
  short b;
  int d;
  tmp e;
};
#pragma pack()
我们在tmp加上一个以1对齐,现在sizeof(tmp1)是16了。

三、更多

还有#pragma pack(push,1)与#pragma pack(1)区别问题。

请看其他的博客有很详细的说明了。

相关标签: struct #pragma