struct 記憶體對齊

2021-09-28 06:27:24 字數 944 閱讀 8167

struct 是一種復合資料型別,其構成元素既可以是基本資料型別(如 int、long、float 等)的變數,也可以是

一些復合資料型別(如 array、struct、union 等)的資料單元。對於結構體,編譯器會自動進行成員變數的對齊,

以提高運算效率。預設情況下,編譯器為結構體的每個成員按其自然對界(natural alignment)條件分配空間。各

個成員按照它們被宣告的順序在記憶體中順序儲存,第乙個成員的位址和整個結構的位址相同。

對齊方式:

1.自然對齊:預設對齊方式,是指按結構體的成員中size最大的成員對齊

例如:struct example  ;

在example 中,size最大的是short ,長度為2個位元組,因此結構體中的char成員a、c都以2為單位對齊,那麼sizeof(example) = 6;

struct example  ;

此時,sizeof(example) = 12;

2.指定對齊:利用偽指令改變預設的對界條件:

(1)使用偽指令#pragma pack (n),編譯器將按照 n 個位元組對齊;

(2)使用偽指令#pragma pack (),取消自定義位元組對齊方式;

注意:

如果#pragma pack (n)中指定的 n 大於結構體中最大成員的 size,則其不起作用,結構體仍然按照 size 最大的成員進行對界

例如:

#pragma pack (n)

struct example ;

#pragma pack ()

當 n 為 4、8、16 時,其對齊方式均一樣,sizeof(example)的結果都等於 12。

而當n為2 時,其發揮了作用,使得 sizeof(naturalalign)的結果為 8。

struct記憶體對齊

出於速度和空間的考量,編譯器在實現過程中均會採用對struct內的變數進行記憶體對齊的操作,雖然會有一定的空間浪費,卻可以減少在讀取資料時候的讀取操作。先看下面的例子 struct a int main struct b int main struct b int main struct a str...

struct記憶體對齊

關於c 中的struct記憶體對齊,應該也是初學者比較疑惑的乙個知識點,但是搞清楚之後會發現非常簡單,這裡解釋一下struct記憶體到底怎麼對齊。主要記住以下兩點 1.各成員變數存放的起始位址相對於結構的起始位址的偏移量必須為該變數的型別所占用的位元組數的倍數 2.整個struct的記憶體大小需為s...

struct記憶體對齊 詳解

結構體的對齊 在sizeof計算乙個結構體的大小時,經常得到的值比結構體內部成員所佔記憶體總和要大,這就是因為在結構體內部,成員在儲存時有對齊的規則。結構體對齊指的是 編譯器向結構體插入無用記憶體的能力,插入無用記憶體使得結構體成員以最佳方式對齊,從而得到更高的效能。當基本資料型別以位元組位址 幾倍...