2017-02-23 32 views
0

假设我有以下代码段将对象声明放入循环中会有性能损失吗?

for (i = 1..100000) { 
    String s = make_some_string(i); // this function depends on `i` only 
    output_this_result(s); 
} 

会,使任何区别如果String s的声明外循环感动?我猜编译器足够聪明,不要在每个循环中构造和破坏字符串对象。但如果它是一个复杂的定制object,而不是string

+4

测试它。看看生成的asm。 –

+0

我认为编译器足够聪明,但需要测试。 –

+4

可见,一个新的字符串是由'make_some_string()'产生和分配的,并且随后在每次迭代时都会被销毁。你是否尝试测量两种尝试的差异?你观察到了什么? – moooeeeep

回答

1

是否有性能损失将对象声明放入循环中?

可以有。它可以取决于对象的类型和编译器执行的优化。它还取决于什么make_some_string返回(是由复制或转换构造的String),并且可能make_some_string是否对编译器可见(是否在相同的翻译单元中定义?)。

如果你在里面声明对象,它将在每次迭代开始时被构造,并在最后被销毁。调用构造函数和析构函数可能比不调用它们要慢。这些调用只有在没有副作用的情况下才能被优化,并且编译器可以看到它们的实现。

0

当您只询问字符串是应该在循环中还是在循环中声明时,您会错过第三个选项,该选项可能更有效。

考虑:

for (i = 1..100000) { 
    output_this_result(make_some_string(i)); // Depend on `i` only 
} 

通过消除s完全不必决定你将宣布它。很显然,这要求output_this_result不接受字符串引用并对其进行修改,但给定的名称似乎合乎逻辑。 我怀疑任何编译器都会为这个替代产生更糟糕的代码。

(for循环语法看起来不像C++,但是是问题的一部分。)