C “靠近定义变量“之真正原因

来源:百度文库 编辑:神马文学网 时间:2024/04/28 16:58:20
[转自http://blog.csdn.net/hellothere/archive/2006/03/05/616037.aspx  程化的blog]
C++“靠近定义变量“之真正原因
在C++中,都知道要“尽量靠近变量实际使用处进行定义”。对此条规则一般的理解是:这是C++对C“函数开始处进行变量定义”的一种优化,目的是方便程序员定义和使用变量。最近学习时发现,这个规则实际上和C++“面向对象的编程语言”本质密切相关。
考虑如下的类定义和代码段:
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; // 第一个return
}
if (x2.GetNumber() == 2)
{
return 0; // 第二个return
}
return 0; // 最后的return
}
这段代码申明了两个X的局部变量,x1和x2。如果按照C的申明方式把两个变量放在函数的开始处,那么,编译器在每个return返回处都必须对x1和x2调用析构函数。
如果把代码改成如下形式:
int main(int argc, char* argv[])
{
X x1;
if (x1.GetNumber() == 0)
{
return 0; // 第一个return
}
X x2;
if (x2.GetNumber() == 2)
{
return 0; // 第二个return
}
return 0; // 最后的return
}
也就是在使用x2前才申明x2,则第一个return处编译器就不用加入对x2析构函数的调用了。
如果函数申明了比较多的对象,而且函数析构的开销比较大,则“使用前才申明”就能可观地减小代码尺寸和运行时开销。由此观之,本条规定的来源实际上是:“C++是面向对象的编程语言,编译器会插入很多编程者未书写的代码来达成面向对象语义,如果不遵循该规则,这些编译器添加的代码会造成较大的开销”。
C++中,很多似乎无关紧要的规则都有其深刻的含义,不是随便规定的。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=616037