編譯器對(duì)內(nèi)存填充長(zhǎng)度之誤解

字號(hào):

看了《C++ 對(duì)像模型》的人,往往會(huì)誤以為編譯器填充是按照計(jì)算機(jī)字長(zhǎng)填充的,如下:
     class A
     {
     double a;
     char b;
     };考試大-全國(guó)教育類網(wǎng)站(www.Examda。com)
     sizeof(A) == ?
     不了解填充的人會(huì)以為是9,看了c++對(duì)象模型的(像我)往往會(huì)以為是12,昨晚看《程序員面試寶典》一道類似題,開(kāi)始以為答案給錯(cuò)了。。今天一試才知道,原來(lái)我錯(cuò)了。。上題答案(在編譯器默認(rèn)情況下)是 16,VC6.0、MinGW、VS.net均如此。。
     《程序員面試寶典》上如是說(shuō):CPU的優(yōu)化原則大致是這樣的:對(duì)于n字節(jié)的元素(n=2、4、8……)它的首地址能被n整除,才能獲得的性能。設(shè)計(jì)編譯器的時(shí)候可以遵循這個(gè)原則。也就是說(shuō),默認(rèn)情況下,編譯器往往以的變量的長(zhǎng)度為填充長(zhǎng)度,而不是按字節(jié)長(zhǎng)度。當(dāng)然也可以通過(guò) #pragma pack(n) 指定編譯器的填充長(zhǎng)度。這時(shí)候應(yīng)該不是cpu的效率的情況了。
     另外有個(gè)網(wǎng)友討論說(shuō)道如果一個(gè)類中含有另一個(gè)類對(duì)象,是否按照包含類的長(zhǎng)度填充呢?試驗(yàn)了一下,不是這樣,而是按照語(yǔ)言中的基本類型的長(zhǎng)度填充。沒(méi)想到,面試題中也會(huì)考到這么bt的題目,長(zhǎng)見(jiàn)識(shí)了。