當(dāng)前位置:首頁 > 芯聞號(hào) > 充電吧
[導(dǎo)讀]struct的對齊問題是由一道筆試題想到的,筆試題如下:#includeusing?namespace?std; typedef?union?student { ????char?name[10];

struct的對齊問題是由一道筆試題想到的,筆試題如下:

#includeusing?namespace?std;
typedef?union?student
{
????char?name[10];
????long?sno;
????char?sex;
????float?score?[4];
}?STU;
void?main?()
{
????STU?a[5];
????cout?<<?sizeof(a)?<<endl;//輸出:80
}

答案是80,因?yàn)閡nion是可變的以其成員中最大的成員作為該union的大??!
但是換成是struct又是多少呢?

#includeusing?namespace?std;
typedef?struct?student
{
????char?name[10];
????long?sno;
????char?sex;
????float?score?[4];
}?STU;
void?main?()
{
????STU?a[5];
????cout?<<?sizeof(a)?<<endl;//輸出:180
}

答案是180?為什么不是(10+4+1+16)*5=155?因?yàn)閟truct有個(gè)叫對齊方式的問題:
一.自然對齊
不對齊的數(shù)據(jù)存取在x86上影響速度,對齊即是多分配一些字節(jié),填充無用數(shù)據(jù),以空間的損失來換取效率。
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最大的成員作為基本的分配單元,而且與其順序有這密切的聯(lián)系。
例如:

#includeusing?namespace?std;
struct?naturalalign
{
?char?a;
?short?b;
?char?c;
};
void?main?()
{
????cout?<<?sizeof(naturalalign?)?<<endl;//輸出:6
}

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

#includeusing?namespace?std;
struct?naturalalign
{
?char?a;
?int?b;
?char?c;
};
void?main?()
{
????cout?<<?sizeof(naturalalign)?<<endl;//輸出:12
}

其結(jié)果顯然為12。
那么再回到到原題:結(jié)構(gòu)體中,size最大的是long,size是4,所以,按照順序,char name[10],12個(gè)字節(jié);long sno,4個(gè)字節(jié);char sex,4個(gè)字節(jié)(這里對齊了);float score [4],16個(gè)字節(jié)。于是(12+4+4+16)×5=180,就是了!
剛才還說過,與順序有關(guān),我們改一下:

#includeusing?namespace?std;
typedef?struct?student
{
?????char?name[10];
?????char?sex;
?????long?sno;
?????float?score?[4];
}?STU;
void?main?()
{
????STU?a[5];
????cout<<sizeof(a)<<endl;//輸出:160
}

答案是160。為什么,只是換了順序而已呀?關(guān)鍵就在順序上。
結(jié)構(gòu)體中,size最大的是long,size是4,所以,按照順序,char name[10],12個(gè)字節(jié);但是這12中多分配的2個(gè)字節(jié)可以包含后面的char sex(問題就在這);float score [4],16個(gè)字節(jié)。于是(12+4+16)×5=160,就是了!所以要小心呀!
二.指定對齊
一般地,可以通過下面的方法來改變?nèi)笔〉膶R條件:
☆使用偽指令#pragma pack (n),編譯器將按照n個(gè)字節(jié)對齊;
☆使用偽指令#pragma pack (),取消自定義字節(jié)對齊方式。
注意:如果#pragma pack (n)中指定的n大于結(jié)構(gòu)體中最大成員(類型)的size,則其不起作用,結(jié)構(gòu)體仍然按照size最大的成員進(jìn)行對齊。
例如:

#includeusing?namespace?std;
#pragma?pack?(n)
struct?naturalalign
{
????char?a;
????int?b;
????char?c;
};
#pragma?pack()
void?main?()
{
????cout<<sizeof(naturalalign)<<endl;
}

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

#pragma?pack(2)??
struct?test?????//test采用2字節(jié)對齊?
{??
????char?c1;????
????short?s;?????
????int?i;??????
????char?c2;?????
????float?f;????//f長度4字節(jié)??
????double?d;???//d長度8字節(jié)??
????char?c3;????
};??
#pragma?pack()??
void?main?()
{
????cout<<sizeof(test)<<endl;//輸出:24
}

test的內(nèi)存分布如下(以1表示占用字節(jié),*表示空字節(jié))

c1 s i c2 f d c3 1* 11 1111 1* 1111 11111111 1*

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


本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動(dòng)力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉