2010-05-08 126 views
5

我想知道是否此代码: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次?

回答

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(); 
    /* ... */ 
} 
+0

那么,只有您的编译器不会将堆栈变量置零,它的效率才是相等的。 – 2010-05-08 12:37:50

+1

我一开始并不担心自己的效率,但可读性很高。一旦工作,如果速度太慢,那么现在是时候对其进行分析并优化可能的内容。 – 2010-05-08 13:29:49

0

在第二个例子中帮助人类读者p是只有内部的for循环可见。你不能在你的代码中进一步使用它。 就效率而言,它们是相等的。

4

在这种情况下,它是一样的。使用可读性最高的代码的最小范围。

如果int是一个具有重要构造函数和析构函数的类,那么第一个函数(在循环外部声明)可以节省大量资金 - 但是在通常情况下,您通常需要重新创建状态......所以通常最终会根本没有储蓄。

容器可能会有所不同的一个实例。一个字符串或向量使用内部存储器,该存储器的大小将随着它所存储的数据大小而增长。您可能不希望每次都通过循环重构此容器,而只需清除其内容,并且可能不需要在循环内重新分配多少个容器。这可以(在某些情况下)导致显着的性能改进。

的底线是它写清楚,如果分析表明它很重要,移动它了:)

1

他们是在效率方面平等的 - 你应该相信你的编译器摆脱没法比差小。第二个是更好的设计。

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