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

內存對齊,內存對齊原則

編輯:關於C語言

內存對齊,內存對齊原則


#pragma pack(8)

struct TestStruct4 {

char a;

long b;

};
struct TestStruct5 {

char c;

TestStruct4 d;

long long e;

};

#pragma pack() 

問題: A),sizeof(TestStruct5) = ?

B), TestStruct5 的 c 後面空了幾個字節接著是 d?

TestStruct4 中,成員 a 是 1 字節默認按 1 字節對齊,指定對齊參數為 8,這兩個值中取 1,a 按 1 字節對齊;成員 b 是 4 個字節,默認是按 4 字節對齊,這時就按 4 字節對齊,所以 sizeof(TestStruct4)應該為 8;

TestStruct5 中,c 和 TestStruct4 中的 a 一樣,按 1 字節對齊,而 d 是個結構,它是 8 個字節,它按什麼對齊呢?對於結構來說,它的默認對齊方式就是它的所有成員使用的對齊參數中最大 的一個,TestStruct4 的就是 4。所以,成員 d 就是按 4 字節對齊。成員 e 是 8 個字節,它是默認按 8 字節對齊,和指定的一樣,所以它對到 8 字節的邊界上,這時,已經使用了 12 個字節了,所以又添加了 4 個字節的空,從第 16 個字節開始放置成員 e。這時,長度為 24,已經可以被 8(成員 e 按 8 字節對齊)整除。這樣,一共使用了 24 個字節。內存布局如下(*表示空閒內存,1 表示使用內存。 單位為 1byete):

                                            a       b

TestStruct4 的內存布局:1***,1111,

                                          c             d(TestStruct4.a    TestStruct4.b )      e

TestStruct5 的內存布局: 1***,         1***,               1111, ****,                11111111 

這裡有三點很重要:
首先,每個成員分別按自己的方式對齊,並能最小化長度。 其次,復雜類型(如結構)的默認對齊方式是它最長的成員的對齊方式,這樣在成員是復雜類型時,可以最小化長度。 然後,對齊後的長度必須是成員中最大的對齊參數的整數倍,這樣在處理數組時可以保證每一項都邊界對齊。

補充一下,對於數組,比如:char a[3];它的對齊方式和分別寫3個char是一樣的。也就是說它還是按1個字節對齊。如果寫: typedef char Array3[3];Array3 這種類型的對齊方式還是按 1 個字節對齊,而不是按它的長度。

但是不論類型是什麼,對齊的邊界一定是 1,2,4,8,16,32,64....中的一個。 

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