您确实有一个 C++ 标记,并且您在问题中提到了“声明字符串”。因此可能存在性能差异(是的, printf 可能会淹没它)。声明一个非简单变量意味着调用一个构造函数,这可能意味着大量的工作。在这种情况下,在循环内声明它可能会在看似无辜的声明中隐藏重要的工作。
一般来说,答案是,如果你真的关心性能——并且只将示例代码视为两个地方之间声明变量的差异的示例——那么对于非简单变量,最好在循环之外声明它,除非语义在每次迭代时都需要一个新版本的临时变量。
如果性能是一个问题,可能还有很多其他地方首先要查看,但一个考虑因素总是将循环不变量移出循环,特别是如果您更容易判断它是不变的,而不是编译器。看起来像声明的东西,在 C++ 中就属于这一类。
如果,对于(愚蠢的)例子,你有
int k = 43;
for ( int i = 0; i < N; ++i )
{
int j = 17 + k; // k was previously defined outside the loop, but doesn't change in it
l = j * j; // l was also declared outside the loop
}
任何优秀的优化编译器都可以识别出 k 是常量,并且 j 总是被分配 60,而 l 被分配了 3600 N 次,并且可以简单地删除循环并用对 l 的单个分配替换。这里 k 和 j 都是循环不变量。
但是一个不太好的编译器可能会错过该链中的一个链接,并最终创建循环。
当你有
Foo k( 43 ); // a class that takes an int argument to its constructor
for( int i = 0; i < N; ++i )
{
Bar j( k ); // a Bar takes an int argument, adds 17 and stores it.
l = j.squared();
}
相同的不变量。如果不查看 bar 的工作原理,就不容易检测到;如果构造函数和 squared 方法不是内联的,我们只是让它变慢了。