從構(gòu)造函數(shù)內(nèi)調(diào)用虛擬成員函數(shù)
從構(gòu)造符內(nèi)調(diào)用虛擬函數(shù)是前期聯(lián)編的,這樣,它就短路掉了那些原本可能的簡潔的能力:
class Base
{
public:
Base();
virtual void BuildSection();
};
class Subclass:public Base
{
public:
Subclass();
virtual void BuildSection();
};
Base::Base()
{
BuildSection();
};
在此例中,程序員希望構(gòu)造函數(shù)能夠多態(tài)地調(diào)用BuildSection(),當(dāng)正在構(gòu)造的對象是Base對象時(shí)調(diào)用Base::BuildSection(),當(dāng)對象是類Subclass對象時(shí)調(diào)用Subclass::BuildSection()。
由于下列簡單的原因這個(gè)例子不起作用:當(dāng)調(diào)用BuildSection()完成時(shí),正在構(gòu)造的對象僅僅是一個(gè)Base對象。即使對象最終成為Subclass對象,也要等到Subclass的構(gòu)造函數(shù)把它過一遍以后。在這些情況下調(diào)用Subclass::BuildSection()可能是致命的。即使對象將最終成為Subclass對象,但在調(diào)用BuildSection()的時(shí)候,對象只不過是Base對象,而且,這個(gè)調(diào)用必須要前期聯(lián)編到函數(shù)Base::BuildSection()。
指針對準(zhǔn)
當(dāng)你在80x86處理器(例如,你的PC機(jī)的芯片)上執(zhí)行你的程序時(shí),這個(gè)問題不是致命的,但對其他的絕大多數(shù)芯片來說,這就是致命的了。它還會(huì)對你的應(yīng)用程序移植到某個(gè)其他環(huán)境的能力產(chǎn)生影響。此外,甚至對于Intel 處理器來說,這個(gè)問題也將導(dǎo)致低于標(biāo)準(zhǔn)的性能。
當(dāng)你的指針從一種類型轉(zhuǎn)換到另一種類型的時(shí)候,就有可能產(chǎn)生一個(gè)非對準(zhǔn)指針(misaligned pointer)。處理器一般要求內(nèi)存塊的地址要與一個(gè)和這個(gè)內(nèi)存塊的尺寸匹配的邊界對齊。例如,字只能在字邊界上被訪問(地址是二的倍數(shù)),雙字只能在雙字邊界上被訪問(地址是四的倍數(shù)),依次類推。
編譯器通常確保監(jiān)視這個(gè)規(guī)則。但是當(dāng)你的指針類型從一種類型轉(zhuǎn)換成較大類型時(shí),你就可以很輕易地違反這個(gè)規(guī)則:
char cA;
char* pC = &cA;
int* pI;
pI = (int*)pC;
*pI = 0; // this may be fatal.
因?yàn)樽址麅H僅是一個(gè)字節(jié)長,所以地址&cA可能有任意值,包括奇數(shù)值?墒牵琾I應(yīng)只包含四的倍數(shù)的地址。通過轉(zhuǎn)換,答應(yīng)把pC賦給pI,但是假如地址不是四的倍數(shù),則接著發(fā)生的賦值可能使程序崩潰。
對于Intel處理器來說,甚至當(dāng)pC值為奇數(shù)時(shí),該賦值也不是致命的;雖然占用的時(shí)間要長得多,但是賦值還是能夠正常執(zhí)行。請你謹(jǐn)防非對準(zhǔn)指針。
這種情況只在你正在把你的指針從指向一種類型轉(zhuǎn)換成指向較大類型時(shí)才會(huì)出現(xiàn)。
相關(guān)推薦:計(jì)算機(jī)技術(shù)與軟件專業(yè)技術(shù)資格(水平)考試官網(wǎng)匯總
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |