空間換時間
結構體內成員按自身長度自對齊
#### 結構體的總大小為結構體的有效對齊值的整數倍
結構體的有效對齊值的確定(會有編譯器優化問題):
1)當未明確指定時,以結構體中最長的成員的長度為其有效值
2)當用#pragma pack(n)指定時,以n和結構體中最長的成員的長度中較小者為其值。
3)當用attribute((packed))指定長度時,強制按照此值為結構體的有效對齊值
32位機器上定義如下結構體
struct xx
;int xx::_x5;
sizeof(xx) = 24;
首先靜態變數不用管,按最長8個位元組對齊, 其中 _x2 _x3 一起佔8個位元組,_x2擴充套件後佔4個位元組,char _x4[2]直接擴充套件佔8個位元組
如下的結構
struct xx
;int xx::_x5;
sizeof(xx) = 24
struct st
; bool f;
struct st *next;
};
sizeof(st) = 20
//ch 1(對齊4)
//ptr 4
//union 4 這裡和unsigned intc : 2 , d : 1; 位域 c佔兩個2 然後緊接著存d 佔1 然後對齊 是4
//bool 1(對齊 4)
c語言位元組對齊
現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特 定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。基本資料型別自身對齊,也叫自然對齊。就是說...
C語言位元組對齊
一 概念 對齊跟資料在記憶體中的位置有關。如果乙個變數的記憶體位址正好位於它長度的整數倍,他就被稱做自然對齊。比如在32位cpu下,假設乙個整型變數的位址為0x00000004,那它就是自然對齊的。二 為什麼要位元組對齊 需要位元組對齊的根本原因在於cpu訪問資料的效率問題。假設上面整型變數的位址不...
C語言位元組對齊
一 概念 對齊跟資料在記憶體中的位置有關。如果乙個變數的記憶體位址正好位於它長度的整數倍,他就被稱做自然對齊。比如在32位cpu下,假設乙個整型變數的位址為0x00000004,那它就是自然對齊的。二 為什麼要位元組對齊 在c語言中,結構是一種復合資料型別,其構成元素既可以是基本資料型別 如int ...