struct的成員對齊

2021-04-14 00:17:13 字數 3319 閱讀 4494

struct

的成員對齊

intel

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

#include

#pragma pack(8)

struct example1 ;

struct example2 ;

#pragma pack()

int main(int argc, char* argv)

問程式的輸入結果是什麼?

答案是: 8

16 4

不明白?還是不明白?下面一一道來:

自然對界

(natural alignment)

struct

是一種復合資料型別,其構成元素既可以是基本資料型別(如

int、

long

、float

等)的變數,也可以是一些復合資料型別(如

array

、struct

、union

等)的資料單元。對於結構體,編譯器會自動進行成員變數的對齊,以提高運算效率。預設情況下,編譯器為結構體的每個成員按其自然對界(

natural alignment

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

自然對界

(natural alignment)

即預設對齊方式,是指按結構體的成員中

size

最大的成員對齊。

例如:struct naturalalign ;

在上述結構體中,

size

最大的是

short

,其長度為

2 位元組,因而結構體中的

char 成員a

、c 都以2

為單位對齊,

sizeof(naturalalign)

的結果等於6;

如果改為:

struct naturalalign ;

在上述結構體中,

size

最大的是

int,其長度為

4 位元組,因而結構體中的

char 成員a

、c 都以4

為單位對齊,

sizeof(naturalalign)

的結果顯然為12。

指定對界

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

使用偽指令

#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 ->settings…-> c/c++

選項卡,在

category

選擇code generation

後,在struct member alignment

中指定你要的對界方式。

圖1 在vc++ 6.0

中指定對界方式

另外,通過

__attribute((aligned (n)))

也可以讓所作用的結構體成員對齊在

n 位元組邊界上,但是它較少被使用,因而不作詳細講解。

下面給個小例子:

struct naturalalignment ;

#pragma pack(2)

struct specifyalignment ;

int main()

//輸出:

//size of struct na is 12 (4+4+4)

//size of struct sa is 8 (2+4+2)

注意:不是

2+2+2

,因為size

最大的成員不用對齊

面試題的解答

至此,我們可以對

intel

、微軟的面試題進行全面的解答。

程式中第2 行

#pragma pack (8)

雖然指定了對界為

8,但是由於

struct example1

中的成員最大

size 為4

(long

變數size 為4

),故struct example1

仍然按4

位元組對界,

struct example1

的size為8

,即第18

行的輸出結果;

struct example2

中包含了

struct example1

,其本身包含的簡單資料成員的最大

size 為2

(short變數e

),但是因為其包含了

struct example1

,而struct example1

中的最大成員

size 為4

,struct example2

也應以4

對界,#pragma pack (8)

中指定的對界對

struct example2

也不起作用,故

19 行的輸出結果為

16(4+8+4);

由於struct example2

中的成員以

4 為單位對界,故其

char

變數c

後應補充

3 個空,其後才是成員

struct1

的記憶體空間,

20 行的輸出結果為4。

文章**《

嵌入式c/c++

語言精華》 

struct的成員對齊

1struct 的成員對齊 intel 微軟等公司曾經出過一道類似的面試題 include pragma pack 8 struct example1 struct example2 pragma pack int main int argc,char argv 問程式的輸入結果是什麼?答案是 8 ...

struct的成員對齊

intel 微軟等公司曾經出過一道類似的面試題 1.include 2.pragma pack 8 3.struct example1 4.8.struct example2 9.14.pragma pack 15.int main int argc,char argv 16.問程式的輸入結果是什麼...

struct的成員對齊

struct的成員對齊 1 自然對界 struct 是一種復合資料型別,其構成元素既可以是基本資料型別 如int long float 等 的變數,也可以是一些復合資料型別 如array struct union 等 的資料單元。對於結構體,編譯器會自動進行成員變數的對齊,以提高運算效率。預設情況下...