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 等 的資料單元。對於結構體,編譯器會自動進行成員變數的對齊,以提高運算效率。預設情況下...