C語言 位元組對齊

2021-07-22 23:10:11 字數 1089 閱讀 9959

空間換時間

結構體內成員按自身長度自對齊

#### 結構體的總大小為結構體的有效對齊值的整數倍

結構體的有效對齊值的確定(會有編譯器優化問題):

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 ...