结构体-内存对齐

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了结构体-内存对齐相关的知识,希望对你有一定的参考价值。

 struct A{
   char c1;
   int i;
   short s;
   int j;
}a;

sizeof(a)的值是16。

分析:char  c1占用1个字节

   int  i占用4个字节,c1不是i的整数倍,所以c1对齐为4个字节

     (c1 + i)占用8个字节

   short  s占用2个字节

        (c1 + i) 是s的整数倍,所以i不用对齐

        (c1+ i + s)占用10个字节

        int  j占用4个字节,(c1 + i + s)不是j的整数倍,所以s对齐为4个字节

        (c1 + i + s + j)占用16个字节,是占用字节最大的成员变量类型(int)所占字节数的整数倍,所以j不用对齐,所以sizeif(a)的值是16。

struct B{
   int i;
   int j;  
   short s;
   char c1;
}b;

sizeof(b)的值是12。

分析:

  int  i占用4个字节,int  j占用4个字节,i是j的整数倍,所以i不用对齐

  (i+j)占用8个字节,short  s占用2个字节,(i+j)是s的整数倍,所以j不用对齐

      (i+j+s)占用10个字节,char  c1占用1个字节,(i+j+s)是c1的整数倍,所以s不用对齐

  (i+j+s+c1)占用11个字节,不是占用字节最大的成员变量类型(int)所占字节数的整数倍,所以c1要对齐为2个字节

  所以sizeof(b)的值为12。

对齐方法总结:

1、前面的成员变量所占字节总数要是下一个成员变量所占字节数的整倍数。

   否则,前面的成员变量中的最后一个成员变量需要对齐,使前面的成员变量所占字节总数是下一个成员变量所占字节数的最小整数倍。

2、所有成员变量所占字节总数要是占用字节数最大的成员变量的整倍数。

   否则,最后一个成员变量需要对齐,使所有成员变量所占字节总数要是占用字节数最大的成员变量的最小整倍数。

  

以上是关于结构体-内存对齐的主要内容,如果未能解决你的问题,请参考以下文章

结构体内存对齐

C语言精要总结-内存地址对齐与struct大小判断篇

C语言精要总结-内存地址对齐与struct大小判断篇

C生万物 | 校招热门考点 —— 结构体内存对齐

Visual Studio2008 C++结构体成员需要内存对齐吗?

C++基本知识点总结(网摘)