c ++变量声明

时间:2010-05-08 12:17:17

标签: c++

我想知道这段代码是否存在:

int main(){
    int p;
    for(int i = 0; i < 10; i++){
      p = ...;
    }
    return 0
}

与那个

完全相同
int main(){
    for(int i = 0; i < 10; i++){
      int p = ...;
    }
    return 0
}

效率方面? 我的意思是,在第二个例子中,p变量将被重建10次?

4 个答案:

答案 0 :(得分:9)

  • 在效率方面是一样的。
  • 在可读性方面不一样。第二个在这方面更好,不是吗?

这是语义的差异,代码保持隐藏,因为它对 int 没有任何影响,但它对人类读者产生了影响。您是否希望在循环外的...中携带您所做计算的值?你不这样做,所以你应该编写反映你意图的代码。

人类读者需要寻求这个功能,并寻找p的其他用途,以确认自己所做的只是过早的“优化”而没有任何更深层的目的。

假设它对您使用的类型有所不同,您可以通过评论代码来帮助人类读者

/* p is only used inside the for-loop, to keep it from reallocating */
std::vector<int> p;
p.reserve(10);

for(int i = 0; i < 10; i++){
  p.clear();
  /* ... */
}

答案 1 :(得分:4)

在这种情况下,它是一样的。尽可能使用最小的范围来获得最易读的代码。

如果int是一个具有重要构造函数和析构函数的类,那么第一个(在循环外声明它)可以节省很多 - 但在内部你通常需要重新创建状态...所以经常它最终完全没有储蓄。

可能产生影响的一个例子是容器。字符串或向量使用内部存储,该存储会增长以适合其存储的数据大小。您可能不希望每次通过循环重建此容器,而只是清除其内容,并且可能不需要在循环内重新分配那么多。这可以(在某些情况下)导致显着的性能提升。

底线是清楚地写出来,如果分析显示它很重要,请将其移出:)

答案 2 :(得分:1)

它们在效率方面是相同的 - 你应该相信你的编译器摆脱了无法估量的微小差异。第二个是更好的设计。

编辑:对于自定义类型,尤其是那些处理内存的类型,不一定如此。如果您正在为任何T编写循环,我肯定会使用第一个表单以防万一。但是如果你知道它是一个内置类型,比如int,pointer,char,float,bool等我会去第二个。

答案 3 :(得分:0)

在第二个例子中,p只在for循环内部可见。你不能在你的代码中进一步使用它。 在效率方面,他们是平等的。