我测试了一段代码(实际上不是这个,这里只是一个简化版本):
#include <vector>
#include <iostream>
auto f() {
//imagine a lot of instructions before the last line
return std::vector{1, 2};
}
int main() {
auto vec = f();
for (auto i : vec)
std::cout << i;
return 0;
}
我陷入了那一刻:
auto vec = f();
for (auto i : vec)
我可以用
for (auto i : f())
代替吗?输出显示相同。
我了解缓存级优化。函数的结果被保存,因此如果我们使用相同的参数调用它,我们不需要再次评估答案。但我想知道是否有编译器优化?
我使用过 godbolt.org,但我觉得它没什么用。
我可以用 for (auto i : f()) 代替吗?
它与原始版本之间的唯一区别是,从调用
f()
中实现的临时物化只会存活到 range-for 循环的末尾,而原始版本中的 vec
将存活到块的末尾这是宣布的。
无论哪种方式,
f()
都会被调用一次。
在您给出的示例中,任何像样的编译器都会生成完全相同或实际上等效的机器指令。仅当调用
std::vector
的析构函数的确切点很重要时,才会有差异。