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

franksunny的個(gè)人技術(shù)空間
獲得人生中的成功需要的專注與堅(jiān)持不懈多過天才與機(jī)會(huì)。 ——C.W. Wendte

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

 

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

 

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

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. }

問程序的輸入結(jié)果是什么?

答案是:

8

16

4

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

1 自然對界

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

自然對界 (natural alignment) 即默認(rèn)對齊方式,是指按結(jié)構(gòu)體的成員中 size 最大的成員對齊。

例如:

struct naturalalign

{

char a;

short b;

char c;

};

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

如果改為:

struct naturalalign

{

char a;

int b;

char c;

};

其結(jié)果顯然為 12

 

2 指定對界

一般地,可以通過下面的方法來改變?nèi)笔〉膶鐥l件:

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

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

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

例如:

#pragma pack (n)

struct naturalalign

{

char a;

int b;

char c;

};

#pragma pack ()

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

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

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

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

 

3   面試題的解答

至此,我們可以對 Intel 、微軟的面試題進(jìn)行全面的解答。

程序中第 2 #pragma pack (8) 雖然指定了對界為 8 ,但是由于 struct example1 中的成員最大 size 4 long 變量 size 4 ),故 struct example1 仍然按 4 字節(jié)對界, struct example1 size 8 ,即第 18 行的輸出結(jié)果;

struct example2 中包含了 struct example1 ,其本身包含的簡單數(shù)據(jù)成員的最大 size 2 short 變量 e ),但是因?yàn)槠浒?/span> struct example1 ,而 struct example1 中的最大成員 size 4 struct example2 也應(yīng)以 4 對界, #pragma pack (8) 中指定的對界對 struct example2 也不起作用,故 19 行的輸出結(jié)果為 16

由于 struct example2 中的成員以 4 為單位對界,故其 char 變量 c 后應(yīng)補(bǔ)充 3 個(gè)空,其后才是成員 struct1 的內(nèi)存空間, 20 行的輸出結(jié)果為 4

 

 

在閱讀了此節(jié)之后,本人對為什么在使用過程中用sizeof取得的結(jié)構(gòu)長度不同的問題有了認(rèn)識(shí),不過本人調(diào)試時(shí),不光跟對界方式有關(guān),還和設(shè)置的Processor有關(guān),這方面還請大俠幫我指點(diǎn)下迷津。

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

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

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

int b;

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

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) //強(qiáng)制1字節(jié)對齊
struct DATA4
{
char c1; //偏移量0,累積size = 1
double d; //偏移量1,累積size = 1 + 8 = 9
char c2; //偏移量9,累積size = 9 + 1 = 10
};
#pragma pack(pop) //恢復(fù)默認(rèn)對齊方式

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;
}  回復(fù)  更多評論
  
# re: 由一道面試題來看Struct的對界(再談結(jié)構(gòu))
2008-07-18 11:37 | dshy
struct test {
char x1;
short x2;
float x3;
char x4;
};

sizeof(test)是多少?  回復(fù)  更多評論
  
# re: 由一道面試題來看Struct的對界(再談結(jié)構(gòu))
2009-03-04 17:59 | JYSG3
錯(cuò)誤,誤人子弟  回復(fù)  更多評論
  
# re: 由一道面試題來看Struct的對界(再談結(jié)構(gòu))
2009-03-18 16:12 | 撒旦
sizeof(test)是多少?
//應(yīng)該是12個(gè)字節(jié)吧,1 + 2 + (1) + 4 +1 =9,因?yàn)槭且?字節(jié)對起,所以應(yīng)該是12字節(jié)。  回復(fù)  更多評論
  
# re: 由一道面試題來看Struct的對界(再談結(jié)構(gòu))
2010-04-24 11:43 | 小林
您好: 我讀了你的代碼分析,收獲頗多。也發(fā)現(xiàn)了一點(diǎn)小問題,現(xiàn)向你提一下。
我將你的程序在機(jī)子上運(yùn)行,發(fā)現(xiàn)你的分析結(jié)果跟電腦顯示的結(jié)果不一樣。
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
};   回復(fù)  更多評論
  
# re: 由一道面試題來看Struct的對界(再談結(jié)構(gòu))
2011-03-16 13:53 | casper
路過,學(xué)習(xí),有問題:
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
};
就拿這個(gè)來說 這個(gè)的結(jié)果應(yīng)該是16

不能用單獨(dú)的最長來界定

單個(gè)的元素需要在結(jié)構(gòu)體內(nèi)部對齊

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

常用鏈接

留言簿(13)

隨筆分類

個(gè)人其它博客

基礎(chǔ)知識(shí)鏈接

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美激情aⅴ一区二区三区| 久久免费午夜影院| 国产精品一区2区| 国产精品大片免费观看| 欧美日韩国产欧美日美国产精品| 欧美成人精品三级在线观看| 欧美大片专区| 欧美高清视频一区| 欧美日韩亚洲一区二区三区四区| 国产精品不卡在线| 国模精品一区二区三区色天香| 激情五月***国产精品| 亚洲欧洲午夜| 亚洲欧美在线看| 久久婷婷久久| 亚洲视频在线观看三级| 欧美呦呦网站| 欧美麻豆久久久久久中文| 国产精品久久久久久亚洲调教| 狠狠色丁香久久综合频道| 亚洲黄色一区| 性8sex亚洲区入口| 欧美黄污视频| 性色av一区二区三区| 欧美经典一区二区| 国产亚洲精品bv在线观看| 99re在线精品| 噜噜噜91成人网| 亚洲无毛电影| 欧美精品一卡二卡| 国产亚洲精品自拍| 一区二区三区日韩在线观看| 久久亚洲私人国产精品va| 亚洲精品美女在线观看播放| 亚洲自拍偷拍视频| 欧美日本高清一区| 亚洲国产精品小视频| 久久电影一区| 亚洲欧美一级二级三级| 欧美人交a欧美精品| 国产专区精品视频| 亚洲在线播放| 亚洲国产日韩在线一区模特| 欧美一级理论片| 欧美午夜精品电影| 999在线观看精品免费不卡网站| 狼狼综合久久久久综合网| 性欧美大战久久久久久久久| 国产精品日韩欧美一区二区| 亚洲一区成人| aa级大片欧美| 国产精品久久国产精品99gif| 亚洲视频一二| 99综合在线| 国产精品青草综合久久久久99| 一区二区三区精品视频| 亚洲精品男同| 欧美肉体xxxx裸体137大胆| 亚洲日本中文字幕| 亚洲精品视频在线看| 欧美日韩国产精品一区二区亚洲| 99国产精品久久久久久久成人热| 欧美成人中文| 激情综合亚洲| 欧美电影电视剧在线观看| 久久岛国电影| 狠狠狠色丁香婷婷综合久久五月 | 国产色综合久久| 亚洲一区免费在线观看| 最新国产成人在线观看| 欧美日韩高清在线观看| 一区二区三区四区精品| 亚洲精品资源| 国产伦理一区| 另类人畜视频在线| 欧美国产一区二区在线观看| 亚洲毛片在线| 亚洲靠逼com| 欧美色欧美亚洲另类二区| 中文在线不卡| 欧美一区二区视频在线| 好吊成人免视频| 亚洲国产精品va| 欧美午夜激情小视频| 久久福利毛片| 另类春色校园亚洲| 一本久久a久久精品亚洲| 夜夜嗨av一区二区三区四区 | 中日韩男男gay无套| 国产精品中文字幕欧美| 狼人社综合社区| 欧美日韩人人澡狠狠躁视频| 欧美在线日韩在线| 欧美福利视频一区| 欧美一区国产在线| 可以免费看不卡的av网站| 亚洲裸体视频| 欧美一区二区视频在线观看| 亚洲精品社区| 亚洲尤物在线视频观看| 亚洲高清不卡在线观看| 亚洲特黄一级片| 日韩午夜三级在线| 久久九九热免费视频| 夜夜精品视频| 久久伊人免费视频| 亚洲自拍高清| 欧美成va人片在线观看| 久久成人亚洲| 国产精品久久999| 欧美福利电影在线观看| 国产精品主播| 一本色道久久加勒比精品| 亚洲欧洲综合另类在线| 久久精品国产综合| 欧美中在线观看| 欧美日韩一级黄| 欧美电影免费| 国内精品99| 亚洲视频网站在线观看| 欧美专区亚洲专区| 欧美日韩不卡视频| 亚洲成在人线av| 欧美成人免费一级人片100| 亚洲视频在线视频| 久久综合婷婷| 久久综合伊人77777尤物| 欧美三级欧美一级| 亚洲高清色综合| 亚洲国产日韩欧美| 亚洲欧美另类在线观看| 亚洲欧美日韩专区| 欧美精品在线看| 亚洲精品视频二区| 亚洲精选视频在线| 久热精品视频在线| 免费成人黄色片| 亚洲国产欧美久久| 久久一区中文字幕| 欧美 日韩 国产在线| 国模私拍一区二区三区| 久久国产视频网| 六月天综合网| 91久久综合亚洲鲁鲁五月天| 欧美国产高清| 中文日韩欧美| 久久久综合精品| 亚洲国产精品一区| 欧美日韩国产色视频| 一区二区欧美国产| 亚洲欧美在线免费| 黄色成人在线观看| 蜜臀99久久精品久久久久久软件| 亚洲高清三级视频| 午夜精品福利一区二区蜜股av| 欧美系列亚洲系列| 欧美亚洲一区在线| 亚洲国产精品成人久久综合一区| 夜夜嗨av色一区二区不卡| 欧美日韩一区免费| 久久久国产精品亚洲一区| 欧美激情一二三区| 亚洲欧美日韩国产| 国产在线精品一区二区中文| 欧美+日本+国产+在线a∨观看| 最新日韩av| 久久xxxx精品视频| 日韩一级在线| 黄色一区三区| 国产精品国产三级国产aⅴ9色| 久久精品系列| 亚洲毛片在线观看.| 久久婷婷人人澡人人喊人人爽| 亚洲国产一区二区a毛片| 欧美日韩视频第一区| 久久精品一区四区| 99视频超级精品| 美女啪啪无遮挡免费久久网站| 亚洲天堂久久| 亚洲第一精品夜夜躁人人躁| 国产精品成人va在线观看| 久久精品99无色码中文字幕| 一本色道婷婷久久欧美| 老司机精品久久| 午夜在线观看欧美| 亚洲日本成人网| 精品91在线| 国产精品欧美日韩| 欧美日韩黄色一区二区| 久久久水蜜桃av免费网站| 亚洲一区三区视频在线观看 | 亚洲精品视频免费| 亚洲欧美韩国| 一本一道久久综合狠狠老精东影业 | 免费在线观看成人av| 亚洲欧美日韩成人高清在线一区| 亚洲精品国产精品久久清纯直播| 国产专区欧美精品| 国产精品一区一区| 国产精品免费在线|