[笔试题]struct内存对齐

来源:互联网 发布:霍去病怎么死的 知乎 编辑:程序博客网 时间:2024/06/06 02:10

        结构体的内存对齐实际上是硬件工程师的事,但是由于笔试经常考,而且我们在实际项目中由于设置的对齐方式不对曾经导致过在不同机器上不能移植的问题。所以有必要了解一下。

         1.为什么需要内存对齐:因为计算机一次处理数据的单元不是字节,而是块。(即1 2 4  8 16字节)

         2.struct是怎样进行内存布局的;

         总体来说就是,某一中类型要在其尺寸大小整数倍的地址上放置,最后一个变量要补充空位(为了方便快速的实现这种结构体的数组)。

         常用字节数(32位机):

         int           一个字 32位,4字节

        short       半个字  16位,2字节

        long        一个字  32位,4字节

        char                                    1字节

        float        一个字   32位 ,4字节

        double    两个字  64位, 8字节

         看如下几个结构体的内存布局:

       1.  typedef struct ms1
                  {
                          char a;
                           int b;
                    } MS1;

              内存布局为:1+3+4=8

       _______________________________________
       |       |\\\\\\\\\\\|                 |
       |   a   |\\padding\\|       b         |
       |       |\\\\\\\\\\\|                 |
       +-------------------------------------+
 Bytes:    1         3             4

 

        2.  typedef  struct ms2

              {    int a;

                   char b;

               }MS2;

            内存布局为:4+1+3=8;后面的3是填充字节。填充的长度是使得满足整体长度能够整除最大成员变量长度。即8/4。

        3. typedef   struct  ms3

             {

                    char a;

                    short b;

                    double c;                   

              }ms3            

               内存布局为:1+1+2+4+8=16。short是2 所以1+1,得到的结果必须能被2整除。double是8,剩下的4个字节放不下,必须填充4个字节,这样1+1+2+4才是8的倍数,然后放入。

         4. typedef struct ms4

             {

                       char a;

                       ms3 b;

             }

             内存布局为: 1+7+16=24。b的最大成员变量是8,所以前面要填充7个字节。

            如果要知道详细的情况,参考http://hi.baidu.com/phps/blog/item/f03eb93ee12f49fa838b1365.html

原创粉丝点击