青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

franksunny的個人技術空間
獲得人生中的成功需要的專注與堅持不懈多過天才與機會。 ——C.W. Wendte

由一道面試題來看 Struct 的對界

 

本文節選自宋寶華的C/C++struct深層探索一文,本人對其所描述的struct對齊比較喜歡,為此轉來與大家分享,原文見http://blog.donews.com/21cnbao/archive/2005/09/08/544877.aspx

 

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

1. #include <iostream.h>

2. #pragma pack(8)

3. struct example1

4. {

5.     short a;

6.     long b;

7. };

8. struct example2

9. {

10.          char c;

11.          example1 struct1;

12.          short e;

13. };

14. #pragma pack()

 

15. int main(int argc, char* argv[])

16. {

17.          example2 struct2;

18.   cout << sizeof(example1) << endl;

19.   cout << sizeof(example2) << endl;

20.   cout << (unsigned int)(&struct2.struct1) - (unsigned int)(&struct2)

<< endl;

21. return 0;

22. }

問程序的輸入結果是什么?

答案是:

8

16

4

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

1 自然對界

struct 是一種復合數據類型,其構成元素既可以是基本數據類型(如 int long float 等)的變量,也可以是一些復合數據類型(如 array struct union 等)的數據單元。對于結構體,編譯器會自動進行成員變量的對齊,以提高運算效率。缺省情況下,編譯器為結構體的每個成員按其自然對界( natural alignment )條件分配空間。各個成員按照它們被聲明的順序在內存中順序存儲,第一個成員的地址和整個結構的地址相同。

自然對界 (natural alignment) 即默認對齊方式,是指按結構體的成員中 size 最大的成員對齊。

例如:

struct naturalalign

{

char a;

short b;

char c;

};

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

如果改為:

struct naturalalign

{

char a;

int b;

char c;

};

其結果顯然為 12

 

2 指定對界

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

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

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

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

例如:

#pragma pack (n)

struct naturalalign

{

char a;

int b;

char c;

};

#pragma pack ()

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

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

1  在 VC++ 6.0 中指定對界方式

另外,通過 __attribute((aligned (n))) 也可以讓所作用的結構體成員對齊在 n 字節邊界上,但是它較少被使用,因而不作詳細講解。

 

3   面試題的解答

至此,我們可以對 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

由于 struct example2 中的成員以 4 為單位對界,故其 char 變量 c 后應補充 3 個空,其后才是成員 struct1 的內存空間, 20 行的輸出結果為 4

 

 

在閱讀了此節之后,本人對為什么在使用過程中用sizeof取得的結構長度不同的問題有了認識,不過本人調試時,不光跟對界方式有關,還和設置的Processor有關,這方面還請大俠幫我指點下迷津。

    過了快一年了,回過頭來再看看這篇文章發現還是有用的,另外再加上一句別人:當未用 #pragma 指令指定編譯器的對齊位數時,結構體按最長寬度的數據成員的寬度對齊;當使用了#pragma 指令指定編譯器的對齊位數時,結構體按最長寬度的數據成員的寬度和 #pragma 指令指定的位數中的較小值對齊。(2007年10月8日) 

posted on 2006-10-20 21:52 frank.sunny 閱讀(2129) 評論(9)  編輯 收藏 引用 所屬分類: C/C++學習和實踐

FeedBack:
# re: 由一道面試題來看Struct的對界(再談結構)
2006-12-22 13:32 | mumutou
錯誤,struct所說的對齊不是這么回事
  回復  更多評論
  
# re: 由一道面試題來看Struct的對界(再談結構)
2006-12-22 13:34 | mumutou
char a;

int b;

char c;
按照4邊界對齊,1+4+1 =6;
(6/4+1) * 4 = 8
也就是說對struct總的長度進行4邊界對齊,而不是對每個struct內容4邊界對齊  回復  更多評論
  
# re: 由一道面試題來看Struct的對界(再談結構)
2006-12-26 20:59 | frank.sunny
謝謝樓上的大俠提點,在你的指點下,認真看了下對齊的東西,你說的也不是很對
上面的題按4邊界對齊的話,也要考慮順序的即 1+(3)+ 4 + 1 = 9
(9 / 4 +1) * 4 = 12
也就前一個類型根據后一個類型擴展
具體我再附上別人的源代碼。

struct DATA1
{
char c1; //偏移量0,累積size = 1
char c2; //偏移量1,累積size = 1 + 1 = 2
short si; //偏移量2,累積size = 2 + 2
};

struct DATA2
{
char c1; //偏移量0,累積size = 1
short si; //偏移量1 + (1),累積size = 1 + (1) + 2 = 4
char c2; //偏移量4,累積size = 4 + 1 = 5,但按最大長度sizeof(short) = 2對齊,故最后取6
};

struct DATA3
{
char c1; //偏移量0,累積size = 1
double d; //偏移量1 + (7),累積size = 1 + (7) + 8 = 16
char c2; //偏移量16,累積size = 16 + 1 = 17,但按最大長度sizeof(double) = 8對齊,故最后取24
};

#pragma pack(push,1) //強制1字節對齊
struct DATA4
{
char c1; //偏移量0,累積size = 1
double d; //偏移量1,累積size = 1 + 8 = 9
char c2; //偏移量9,累積size = 9 + 1 = 10
};
#pragma pack(pop) //恢復默認對齊方式

struct DATA5
{
char c1;
double d;
char c2;
};

void main()
{
cout << "sizeof(DATA1) = " << sizeof(DATA1) << endl;
cout << "sizeof(DATA2) = " << sizeof(DATA2) << endl;
cout << "sizeof(DATA3) = " << sizeof(DATA3) << endl;
cout << "sizeof(DATA4) = " << sizeof(DATA4) << endl;
cout << "sizeof(DATA5) = " << sizeof(DATA5) << endl;
}  回復  更多評論
  
# re: 由一道面試題來看Struct的對界(再談結構)
2008-07-18 11:37 | dshy
struct test {
char x1;
short x2;
float x3;
char x4;
};

sizeof(test)是多少?  回復  更多評論
  
# re: 由一道面試題來看Struct的對界(再談結構)
2009-03-04 17:59 | JYSG3
錯誤,誤人子弟  回復  更多評論
  
# re: 由一道面試題來看Struct的對界(再談結構)
2009-03-18 16:12 | 撒旦
sizeof(test)是多少?
//應該是12個字節吧,1 + 2 + (1) + 4 +1 =9,因為是以4字節對起,所以應該是12字節。  回復  更多評論
  
# re: 由一道面試題來看Struct的對界(再談結構)
2010-04-24 11:43 | 小林
您好: 我讀了你的代碼分析,收獲頗多。也發現了一點小問題,現向你提一下。
我將你的程序在機子上運行,發現你的分析結果跟電腦顯示的結果不一樣。
double,long 最大長度不是按8 對齊,而是 按4對齊。
struct DATA3
{
char c1; //偏移量0,累積size = 1
double d; //偏移量1 + (3),累積size = 1 + (3) + 8 = 112
char c2; //偏移量16,累積size = 12+ 1 = 13,但按最大長度sizeof(double) = 4對齊,故最后取16
};   回復  更多評論
  
# re: 由一道面試題來看Struct的對界(再談結構)
2011-03-16 13:53 | casper
路過,學習,有問題:
struct DATA3
{
char c1; //偏移量0,累積size = 1
double d; //偏移量1 + (7),累積size = 1 + (7) + 8 = 16
char c2; //偏移量16,累積size = 16 + 1 = 17,但按最大長度sizeof(double) = 8對齊,故最后取24
};
就拿這個來說 這個的結果應該是16

不能用單獨的最長來界定

單個的元素需要在結構體內部對齊

同時最后還需要界定整個結構體的對齊問題  回復  更多評論
  
# re: 由一道面試題來看Struct的對界(再談結構)
2011-03-16 14:03 | casper
struct DATA3{
char c1;
double d;
char c2;
};
*結構體內部 有補齊需求的只有d
sizeof(double) > 4 ---> 4
c1 block 1+(3)=4
total: 1+(3)+8+1=13
*結構體開始對齊
sizeof(double) > 4 ---> 4 4*4-3=13
c2 block 1+(3)=4
total: 1+(3)+8+1+(3)=16@casper
  回復  更多評論
  

常用鏈接

留言簿(13)

隨筆分類

個人其它博客

基礎知識鏈接

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品资源在线观看| 久久久久久午夜| 欧美午夜免费电影| 欧美久久久久久久| 欧美韩日高清| 欧美日韩免费高清| 欧美日韩精品一区二区天天拍小说| 欧美人与禽性xxxxx杂性| 欧美日韩国产三级| 国产精品视频专区| 精品成人a区在线观看| 在线观看精品视频| 99精品国产一区二区青青牛奶| 亚洲美女福利视频网站| 亚洲天堂黄色| 久久精品国产99国产精品澳门| 麻豆国产精品777777在线| 欧美激情亚洲自拍| 日韩亚洲欧美一区二区三区| 亚洲无吗在线| 久久久午夜视频| 欧美另类一区| 国产揄拍国内精品对白| 亚洲日本久久| 欧美一区在线视频| 亚洲国产日韩欧美| 亚洲性xxxx| 欧美不卡福利| 国模套图日韩精品一区二区| 亚洲精品资源| 久久亚洲国产精品日日av夜夜| 日韩天天综合| 免费91麻豆精品国产自产在线观看| 国产精品啊啊啊| 亚洲国产高潮在线观看| 欧美有码视频| 日韩视频一区二区三区| 久久久夜精品| 国产亚洲成年网址在线观看| 99精品久久免费看蜜臀剧情介绍| 久久精品二区亚洲w码| 亚洲精品国产精品国自产在线| 欧美一区二区播放| 国产精品欧美日韩一区二区| 99国产欧美久久久精品| 模特精品在线| 久久福利电影| 国产日韩欧美一区在线| 亚洲欧美一区二区激情| 亚洲精选视频在线| 欧美激情五月| 亚洲精华国产欧美| 欧美刺激性大交免费视频 | 一本色道久久加勒比精品| 美女网站久久| 久久久久中文| 亚洲大片在线| 欧美jizz19性欧美| 久久夜色精品国产亚洲aⅴ| 国内外成人免费视频| 午夜亚洲福利在线老司机| 一区二区日本视频| 国产精品第一区| 亚洲欧美成人一区二区在线电影| 亚洲另类一区二区| 欧美久色视频| 一区二区三区毛片| 99re6热只有精品免费观看| 欧美精品三区| 亚洲一区二区三区中文字幕在线| 99re6热只有精品免费观看| 欧美午夜精品久久久久久超碰| 亚洲图片欧洲图片av| 国产精品一二三四| 午夜精彩国产免费不卡不顿大片| 一区二区不卡在线视频 午夜欧美不卡在 | 在线一区二区三区四区五区| 亚洲精品1区| 欧美区一区二区三区| 亚洲素人在线| 欧美一区日韩一区| 在线精品国精品国产尤物884a| 欧美二区在线观看| 欧美日韩国产在线播放| 亚洲免费在线视频| 久久精品99无色码中文字幕| 亚洲国产精品女人久久久| 亚洲精品在线一区二区| 国产精品一区免费观看| 美女网站久久| 欧美午夜国产| 美女精品网站| 欧美视频一区二区三区在线观看 | 最近中文字幕日韩精品| 国产精品都在这里| 免费一级欧美在线大片| 欧美日韩综合在线免费观看| 久久久91精品国产| 欧美激情精品| 久久久久一区二区三区| 欧美激情影音先锋| 久久久精品国产免大香伊 | 亚洲欧美综合另类中字| 亚洲黄色性网站| 亚洲一二三区在线| 亚洲精品美女| 欧美一区成人| 中文精品视频| 噜噜噜躁狠狠躁狠狠精品视频| 亚洲新中文字幕| 免费av成人在线| 久久精品国亚洲| 欧美日产在线观看| 久久综合久久综合这里只有精品| 欧美日韩国产色综合一二三四 | 亚洲高清影视| 国内一区二区三区| 亚洲午夜一区| 一区二区三区精品视频| 亚洲电影第1页| 欧美高清视频在线播放| 国产酒店精品激情| 可以看av的网站久久看| 亚洲小视频在线观看| 亚洲国产国产亚洲一二三| 噜噜噜噜噜久久久久久91| 久久视频国产精品免费视频在线| 亚洲一二三区在线| 99视频精品| 欧美亚洲一区二区在线| 欧美一级日韩一级| 老司机一区二区| 亚洲观看高清完整版在线观看| 亚洲激情视频网站| 亚洲网站视频福利| 久久久久国产精品午夜一区| 欧美福利网址| 国产精品一区二区男女羞羞无遮挡| 国产精品一区在线观看| 亚洲国产经典视频| 亚洲视频欧美在线| 久久久精品tv| 在线一区二区三区做爰视频网站| 欧美自拍偷拍| 国产日韩欧美精品在线| 亚洲精品乱码久久久久久日本蜜臀 | 久久蜜桃资源一区二区老牛| 久久久久久网站| 亚洲午夜日本在线观看| 免费成人毛片| 悠悠资源网久久精品| 午夜亚洲福利| 亚洲私人黄色宅男| 欧美日韩一区二区精品| 亚洲国产黄色| 欧美国产综合| 免费日韩av电影| 亚洲经典在线看| 欧美aaaaaaaa牛牛影院| 国产综合婷婷| 欧美福利电影网| 久久免费黄色| 亚洲毛片一区二区| 亚洲免费av观看| 国产精品人成在线观看免费| 亚洲欧美日韩一区二区三区在线| 亚洲美女色禁图| 国产精品毛片va一区二区三区| 亚洲综合精品| 久久免费99精品久久久久久| 在线播放不卡| 亚洲精品视频啊美女在线直播| 欧美日韩一区二区三| 久久久91精品国产一区二区三区| 久久国产一区二区| 亚洲永久网站| 麻豆精品视频在线观看视频| 亚洲一区二区三区在线视频| 性久久久久久久久| 在线视频免费在线观看一区二区| 亚洲天堂第二页| 亚洲精品在线免费观看视频| 亚洲色图综合久久| 亚洲免费成人| 蜜桃久久av一区| 久久久91精品国产一区二区精品| 美女国产一区| 久久亚洲综合色一区二区三区| 欧美日韩一区国产| 亚洲区国产区| 亚洲精选视频免费看| 久久久7777| 鲁大师成人一区二区三区 | 欧美一区二区视频观看视频| 99在线精品免费视频九九视| 久久中文字幕一区二区三区| 久久亚洲一区| 亚洲福利专区| 欧美日韩国产一级| 亚洲私拍自拍|