在C++中,都知道要“盡量靠近變量實(shí)際使用處進(jìn)行定義”。對此條規則一般的理解是:這是C++對C“函數開(kāi)始處進(jìn)行變量定義”的一種優(yōu)化,目的是方便程序員定義和使用變量。最近學(xué)習時(shí)發(fā)現,這個(gè)規則實(shí)際上和C++“面向對象的編程語(yǔ)言”本質(zhì)密切相關(guān)。
考慮如下的類(lèi)定義和代碼段:
class X
{
public:
X() : m_number(2);
~X();
void SetNumber(int number){m_number = number;};
int GetNumber(){return m_number};
private:
m_number;
};
int main(int argc, char* argv[])
{
X x1;
X x2;
if (x1.GetNumber() == 0)
{
return 0; // 第一個(gè)return
}
if (x2.GetNumber() == 2)
{
return 0; // 第二個(gè)return
}
return 0; // 最后的return
}
這段代碼申明了兩個(gè)X的局部變量,x1和x2。如果按照C的申明方式把兩個(gè)變量放在函數的開(kāi)始處,那么,編譯器在每個(gè)return返回處都必須對x1和x2調用析構函數。
如果把代碼改成如下形式:
int main(int argc, char* argv[])
{
X x1;
if (x1.GetNumber() == 0)
{
return 0; // 第一個(gè)return
}
X x2;
if (x2.GetNumber() == 2)
{
return 0; // 第二個(gè)return
}
return 0; // 最后的return
}
也就是在使用x2前才申明x2,則第一個(gè)return處編譯器就不用加入對x2析構函數的調用了。
如果函數申明了比較多的對象,而且函數析構的開(kāi)銷(xiāo)比較大,則“使用前才申明”就能可觀(guān)地減小代碼尺寸和運行時(shí)開(kāi)銷(xiāo)。由此觀(guān)之,本條規定的來(lái)源實(shí)際上是:“C++是面向對象的編程語(yǔ)言,編譯器會(huì )插入很多編程者未書(shū)寫(xiě)的代碼來(lái)達成面向對象語(yǔ)義,如果不遵循該規則,這些編譯器添加的代碼會(huì )造成較大的開(kāi)銷(xiāo)”。
C++中,很多似乎無(wú)關(guān)緊要的規則都有其深刻的含義,不是隨便規定的。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=616037
聯(lián)系客服