程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 結構體在內存中的對齊規則,結構體對齊規則

結構體在內存中的對齊規則,結構體對齊規則

編輯:C++入門知識

結構體在內存中的對齊規則,結構體對齊規則


文章轉自:http://blog.csdn.net/grantxx/article/details/7577730

文章不錯,通俗易懂,特此分享。

 

一個結構體變量定義完之後,其在內存中的存儲並不等於其所包含元素的寬度之和。

例一:

                                      #include <iostream>

                                      using namespace std;

                                         struct X

                                         {

                                              char a;

                                              int b;

                                              double c;

                                         }S1;

 

                                     void main()

                                    {

                                         cout << sizeof(S1) << endl;

                                         cout << sizeof(S1.a) << endl;

                                         cout << sizeof(S1.b) << endl;

                                         cout << sizeof(S1.c) << endl;

                                    }

     比如例一中的結構體變量S1定義之後,經測試,會發現sizeof(S1)= 16,其值不等於sizeof(S1.a) = 1、sizeof(S1.b) = 4和 sizeof(S1.c) = 8三者之和,這裡面就存在存儲對齊問題。

    原則一:結構體中元素是按照定義順序一個一個放到內存中去的,但並不是緊密排列的。從結構體存儲的首地址開始,每一個元素放置到內存中時,它都會認為內存是以它自己的大小來劃分的,因此元素放置的位置一定會在自己寬度的整數倍上開始(以結構體變量首地址為0計算)。

    比如此例,首先系統會將字符型變量a存入第0個字節(相對地址,指內存開辟的首地址);然後在存放整形變量b時,會以4個字節為單位進行存儲,由於第一個四字節模塊已有數據,因此它會存入第二個四字節模塊,也就是存入到4~8字節;同理,存放雙精度實型變量c時,由於其寬度為8,其存放時會以8個字節為單位存儲,也就是會找到第一個空的且是8的整數倍的位置開始存儲,此例中,此例中,由於頭一個8字節模塊已被占用,所以將c存入第二個8字節模塊。整體存儲示意圖如圖1所示。

    考慮另外一個實例。

例二:

                                           struct X

                                           {

                                                char a;

                                                double b;

                                                int c;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved