struct自然對齊和指定對齊

2021-06-17 16:22:50 字數 2083 閱讀 6467

intel、微軟等公司曾經出過一道類似的面試題:

#include

#pragma pack(8)

struct example1

;struct example2

;#pragma pack()

int main(int argc, char* argv)

答案是:816

4解釋:

程式中第2行#pragma pack(8)雖然指定了對界為8,但是由於structexample1中的成員最大size為4(long變數size為4),故structexample1仍然按4位元組對界,structexample1的size為8,即第18行的輸出結果;

struct example2中包含了structexample1,其本身包含的簡單資料成員的最大size為2(short變數e),但是因為其包含了structexample1,而struct example1中的最大成員size為4,structexample2也應以4對界,#pragma pack (8)中指定的對界對structexample2也不起作用,故19行的輸出結果為16;

由於structexample2中的成員以4為單位對界,故其char變數c後應補充3個空,其後才是成員struct1的記憶體空間,20行的輸出結果為4。

1 自然對界

struct是一種復合資料型別,其構成元素既可以是基本資料型別(如int、long、float等)的變數,也可以是一些復合資料型別(如array、struct、union等)的資料單元。對於結構體,編譯器會自動進行成員變數的對齊,以提高運算效率。預設情況下,編譯器為結構體的每個成員按其自然對界(naturalalignment)條件分配空間。各個成員按照它們被宣告的順序在記憶體中順序儲存,第乙個成員的位址和整個結構的位址相同。

自然對界(naturalalignment)即預設對齊方式,是指按結構體的成員中size最大的成員對齊。

例如:struct naturalalign

;在上述結構體中,size最大的是short,其長度為2位元組,因而結構體中的char成員a、c都以2為單位對齊,sizeof(naturalalign)的結果等於6;

如果改為:

struct naturalalign

;其結果顯然為12。

2 指定對界

一般地,可以通過下面的方法來改變預設的對界條件:

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

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

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

例如:#pragma pack (n)

struct naturalalign

;#pragma pack ()

當n為4、8、16時,其對齊方式均一樣,sizeof(naturalalign)的結果都等於12。而當n為2時,其發揮了作用,使得sizeof(naturalalign)的結果為8。

在vc++6.0編譯器中,我們可以指定其對界方式(見圖1),其操作方式為依次選擇projetct> setting > c/c++選單,在struct memberalignment中指定你要的對界方式。

3 struct程式設計注意事項

#include

struct structa

;int main(int argc, char* argv)

14行的輸出結果是:a

16行的輸出結果是:b

why?我們在15行對instant2的修改改變了instant1中成員的值!

原因在於13行的instant2 =instant1賦值語句採用的是變數逐個拷貝,這使得instant1和instant2中的cmember指向了同一片記憶體,因而對instant2的修改也是對instant1的修改。

在c語言中,當結構體中存在指標型成員時,一定要注意在採用賦值語句時是否將2個例項中的指標型成員指向了同一片記憶體。

在c++語言中,當結構體中存在指標型成員時,我們需要重寫struct的拷貝建構函式並進行「=」操作符過載。

自然對齊和強制對齊

一 自然對齊 各個型別自然對齊,即其起始記憶體位址必須是其型別本身的整數倍。對於結構體來說,結構體的起始記憶體位址,必須是結構體中成員最大長度型別的整數倍。結構體自然對齊應遵守如下規則 1 資料成員對齊規則 應該是sizeof 成員變數型別 或者sizeof 成員變數型別 的倍數。應該是子結構體中最...

記憶體對齊(自然對齊)

參考 今天與超,暉,棟,宇幾人論此問題,終得以下結論,不知正確與否,姑且記下。對於32位機,cpu的記憶體讀寫週期是4word,所以在記憶體對齊時,皆以此填滿。如 struct a char a double b char c sizeof a 4 8 4 16 struct b char a do...

struct對齊問題

chinaunix最近有個貼子討論熱烈,在這裡記錄一下我的理解,struct的對齊是遵照下列二個條件中最小的乙個進行的 1.pragma pack n 中n指定的值 2.struct中最大的成員 請注意不是指sizeof值最大的那個,而應當是 alignof 值最大的那個 對於double等幾個型別...