假设我们有一个循环,需要迭代多次:
for (int i=0; i < 1000000; ++i) {
int s = 100;
s += i;
cout << s;
}
我们只在循环体内使用s
,因此理想情况下,我们希望在那里声明它,这样它就不会污染封闭的命名空间。
我想知道是否有任何缺点。例如,它会产生性能成本吗,因为程序在每次迭代时重新声明s
?
int
以在循环本地和函数本地变量之间进行切换。const
关键字,并提高优化级别,你将会看到奇迹般的效果。 - Quentinfor(int i = 0;i<1000000;i++)cout<<i+100;
。如果这样的优化可行且不会使您的代码难以阅读,请使用它们。for(int i = 100;y<1000100;y++){cout<<i}
。值得注意的是,一个好的编译器很可能会发现这一点,并优化代码,就像代码是这样编写的一样。我的建议通常是首先编写易于阅读的代码,只有在分析找到瓶颈后才进行优化。" - cdhowiefor(int i = 0;y<1000000;y++)
- zett42销毁一个 int 是一个空操作。变量停止存在,但不需要运行任何运行时代码。
引用或指向停止存在的变量的指针具有未定义行为。在初始化之前,新创建的局部变量具有未定义状态。因此,仅仅为一个新变量重复使用旧变量是合法的,编译器不必证明没有这样的未完成引用。
在这种情况下,如果它能够证明值是恒定的 100
,它甚至可以跳过除第一次初始化外的所有操作。并且它可以“提前”进行此初始化,因为没有定义的方法来检测其提前发生。在这种情况下,它很容易,大多数编译器都会轻松处理它;然而,在更复杂的情况下,则较少如此。如果您将其标记为const
,则编译器不再需要证明它未被修改,而是可以假设它!
C++ 中许多未定义的区域存在,是为了使某些优化易于实现。
现在,如果你有更复杂的东西,比如一个vector<int>{1,2,3,4,5}
,销毁和创建就不再是无操作了。虽然仍然可以将变量“提升”出循环,但对于编译器来说会更加困难。这是因为动态分配有时很难进行优化。
int i
之后声明它,两者都可以工作