我想知道这段代码是否存在:
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次?
答案 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循环内部可见。你不能在你的代码中进一步使用它。 在效率方面,他们是平等的。