现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

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

2012-09-03 19:58 工业·编程 ⁄ 共 894字 ⁄ 字号 暂无评论

在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++中,很多似乎无关紧要的规则都有其深刻的含义,不是随便规定的。

给我留言

留言无头像?