2017年計(jì)算機(jī)等級(jí)考試二級(jí)C++輔導(dǎo):字節(jié)對(duì)齊問題
時(shí)間:2017-05-04 17:38:00 來源:無憂考網(wǎng) [字體:小 中 大]規(guī)則:
1 、數(shù)據(jù)成員對(duì)齊規(guī)則:結(jié)構(gòu) (struct)( 或聯(lián)合 (union)) 的數(shù)據(jù)成員,第一個(gè)數(shù)據(jù)成員放在 offset 為 0 的地方,以后每個(gè)數(shù)據(jù)成員的對(duì)齊按照 #pragma pack 指定的數(shù)值和這個(gè)數(shù)據(jù)成員自身長(zhǎng)度中,比較小的那個(gè)進(jìn)行。
2 、結(jié)構(gòu) ( 或聯(lián)合 ) 的整體對(duì)齊規(guī)則:在數(shù)據(jù)成員完成各自對(duì)齊之后,結(jié)構(gòu) ( 或聯(lián)合 ) 本身也要進(jìn)行對(duì)齊,對(duì)齊將按照 #pragma pack 指定的數(shù)值和結(jié)構(gòu) ( 或聯(lián)合 ) 數(shù)據(jù)成員長(zhǎng)度中,比較小的那個(gè)進(jìn)行。
3 、結(jié)合 1 、 2 可推斷:當(dāng) #pragma pack 的 n 值等于或超過所有數(shù)據(jù)成員長(zhǎng)度的時(shí)候,這個(gè) n 值的大小將不產(chǎn)生任何效果。 使用指令#pragma pack (n),編譯器將按照 n個(gè)字節(jié)對(duì)齊。使用指令#pragma pack (),編譯器將取消自定義字節(jié)對(duì)齊方式。在#pragma pack (n)和#pragma pack ()之間的代碼按 n個(gè)字節(jié)對(duì)齊。
struct s1
{
int a;
char b;
short e;
int c;
};
struct s2
{
int a;
char b;
int c;
short e;
int d;
};
1字節(jié)對(duì)齊 為 11 和 15
2字節(jié)對(duì)齊 為 11 和 16
4字節(jié)對(duì)齊 為 12 和 20
8字節(jié)對(duì)齊 為 12 和 20
16字節(jié)對(duì)齊 為 12 和 20
看如下例子:
#pragma pack(8)
struct TestStruct4
{
char a;
long b;
};
struct TestStruct5
{
char c;
TestStruct4 d;
long long e;
};
#pragma pack()
問題:
A) sizeof(TestStruct5)=?
B) TestStruct5的 c 后面空了幾個(gè)字節(jié)接著是 d ?
TestStruct4中,成員 a 是 1字節(jié),默認(rèn)按 1字節(jié)對(duì)齊,指定對(duì)齊參數(shù)為 8,這兩個(gè)值中取 1,a 按 1字節(jié)對(duì)齊;成員 b 是 4個(gè)字節(jié),默認(rèn)是按 4字節(jié)對(duì)齊,這時(shí)就按 4字節(jié)對(duì)齊,所以sizeof(TestStruct4)應(yīng)該為 8。
TestStruct5 中,c 和 TestStruct4 中的 a 一樣,按 1字節(jié)對(duì)齊,而 d 是個(gè)結(jié)構(gòu),它是 8個(gè)字節(jié),它按什么對(duì)齊呢?對(duì)于結(jié)構(gòu)來說,它的默認(rèn)對(duì)齊方式就是它的所有成員使用的對(duì)齊參數(shù)中的一個(gè), TestStruct4的就是 4。所以,成員 d 就是按 4字節(jié)對(duì)齊。成員 e 是 8個(gè)字節(jié),它是默認(rèn)按 8字節(jié)對(duì)齊,和指定的一樣,以它對(duì)到 8字節(jié)的邊界上。這時(shí),已經(jīng)使用了12個(gè)字節(jié)了,所以又添加了 4個(gè)字節(jié)的空,從第 16個(gè)字節(jié)開始放置成員 e。這時(shí),長(zhǎng)度為24,已經(jīng)可以被 8(成員 e 按 8字節(jié)對(duì)齊)整除。這樣,一共使用了 24個(gè)字節(jié)。內(nèi)存布局如下(*表示空閑內(nèi)存,1表示使用內(nèi)存,單位為 1byete) :
a b
TestStruct4的內(nèi)存布局:1***, 1111
c TestStruct4.a TestStruct4.b d
TestStruct5的內(nèi)存布局: 1***, 1***, 1111, ****, 11111111
這里有三點(diǎn)很重要:
首先,每個(gè)成員分別按自己的方式對(duì)齊,并能最小化長(zhǎng)度。
其次,復(fù)雜類型(如結(jié)構(gòu))的默認(rèn)對(duì)齊方式是它最長(zhǎng)的成員的對(duì)齊方式,這樣在成員是復(fù)雜類型時(shí),可以最小化長(zhǎng)度。
然后,對(duì)齊后的長(zhǎng)度必須是成員中的對(duì)齊參數(shù)的整數(shù)倍,這樣在處理數(shù)組時(shí)可以保證每一項(xiàng)都邊界對(duì)齊。
補(bǔ)充一下:
對(duì)于數(shù)組,比如:char a[3],它的對(duì)齊方式和分別寫 3個(gè) char 是一樣的,也就是說它還是按 1 個(gè)字節(jié)對(duì)齊。如果寫:typedef char Array3[3];Array3 這種類型的對(duì)齊方式還是按 1 個(gè)字節(jié)對(duì)齊,而不是按它的長(zhǎng)度。
- 2009年9月全國(guó)計(jì)算機(jī)四級(jí)數(shù)據(jù)庫(kù)工程師考試真題及答案
- 2009年3月全國(guó)計(jì)算機(jī)四級(jí)數(shù)據(jù)庫(kù)工程師考試真題及答案
- 2008年9月全國(guó)計(jì)算機(jī)四級(jí)數(shù)據(jù)庫(kù)工程師考試真題及答案
- 2008年4月全國(guó)計(jì)算機(jī)四級(jí)數(shù)據(jù)庫(kù)工程師考試真題及答案
- 2011年3月全國(guó)計(jì)算機(jī)二級(jí)Java考試真題及答案
- 2010年9月全國(guó)計(jì)算機(jī)二級(jí)Java考試真題及答案
- 查看計(jì)算機(jī)等級(jí)考試全部真題>>
- 2023年下半年計(jì)算機(jī)等級(jí)考試四級(jí)計(jì)算機(jī)組成與接口備考要點(diǎn)歸納
- 2023年下半年計(jì)算機(jī)等級(jí)考試三級(jí)信息安全技術(shù)復(fù)習(xí)要點(diǎn)匯總
- 2023年下半年計(jì)算機(jī)等級(jí)考試三級(jí)數(shù)據(jù)庫(kù)技術(shù)復(fù)習(xí)要點(diǎn)匯總
- 2023年下半年計(jì)算機(jī)等級(jí)一級(jí)考試Photoshop考點(diǎn)梳理
- 2023年下半年計(jì)算機(jī)等級(jí)考試三級(jí)網(wǎng)絡(luò)技術(shù)考點(diǎn)梳理
- 2023年下半年計(jì)算機(jī)等級(jí)一級(jí)考試WPS office考點(diǎn)匯總
- 查看計(jì)算機(jī)等級(jí)考試全部文檔 >>
- 2024年9月上海計(jì)算機(jī)一級(jí)成績(jī)查詢時(shí)間及查分入口
- 2024年9月全國(guó)計(jì)算機(jī)一級(jí)成績(jī)查詢時(shí)間及查分入口
- 2024年9月浙江省全國(guó)計(jì)算機(jī)等級(jí)考試(NCRE)
- 2024年9月浙江計(jì)算機(jī)二級(jí)考試準(zhǔn)考證打印入口(9
- 2024年9月江蘇計(jì)算機(jī)一級(jí)成績(jī)查詢時(shí)間及查分入口
- 2024年9月江蘇計(jì)算機(jī)等級(jí)考試成績(jī)查詢時(shí)間及查分
- 2024年9月浙江計(jì)算機(jī)二級(jí)成績(jī)查詢時(shí)間及查分入口
- 2024年9月全國(guó)計(jì)算機(jī)三級(jí)成績(jī)查詢時(shí)間及查分入口