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

一、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)区别问题。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值