C++_字节对齐

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_36594453/article/details/61417343

在x86/Linux工作站上,以下两个结构的size分别是20和16,为什么不一样?

typedef struct  _a{                   typedef     struct  _b{

  char  c1;                                                 char c1;

  long  i;                                                    char  c2;

  char  c2;                                                 longi;

  double f;                                                 double f;

}a;                                              }b;

前者按照8字节对齐,后者按照4字节对齐

   

n字节边界对齐的意思是说,一个成员的地址必须安排在成员的尺寸的整数倍地址上或者是n的整数倍地址上,取它们中的最小值。
字节对齐是为了提高CPU的读取效率 .比如有些平台每次读都是从偶地址开始,如果一个int型(假设为32位系统)如果存放在偶地址开始的地方,那么一个读周期就可以读出这32bit,而如果存放在奇地址开始的地方,就需要2个读周期,并对两次读出的结果的高低字节进行拼凑才能得到该32bit数据.显然在读取效率上下降很多. 


#pragma pack(8) /*指定按8字节对齐*/
struct s1{
  short a;
  long b;
};
struct s2{
  char c;
  s1 d;
  long long e;
};
#pragma pack()    /*取消指定对齐,恢复缺省对齐*/
问题:
1.sizeof(s2) = ?
2.s2的c后面空了几个字节接着是d?

答案:sizeof(S2)结果为24。s2的c后面空了3个字节接着是d。

分析:
  S1中,成员a是2字节默认按2字节对齐,指定对齐参数为8,这两个值中取2,a按2字节对齐;同理,成员b是4个字节,按4字节对齐,所以sizeof(S1)应该为8;

                                a       b
S1的内存布局:11**,1111


  S2 中,c按1字节对齐,而d 是个结构,它是8个字节,它按什么对齐呢?

     对于结构来说,它的默认对齐方式就是它的所有成员使用的有效对齐值中最大的一个,S1的就是4.所以,成员d就是按4字节对齐.成员e是8个字节,它是默认按8字节对齐,和指定的一样,所以它对到8字节的边界上,这时,已经使用了12个字节了,所以添加了4个字节的空,从第16个字节开始放置成员e。这样一共使用了24个字节。


                          c       S1.a  S1.b  d
S2的内存布局:1***,11**,1111,****11111111

【按?字节对齐,就去找?的倍数的地址】


猜你喜欢

转载自blog.csdn.net/sinat_36594453/article/details/61417343
今日推荐