在循环中,编译器真的会调用在每次迭代中返回相同值的函数吗?

问题描述 投票:0回答:1

我测试了一段代码(实际上不是这个,这里只是一个简化版本):

#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,但我觉得它没什么用。

c++ compiler-optimization
1个回答
1
投票

我可以用 for (auto i : f()) 代替吗?

它与原始版本之间的唯一区别是,从调用

f()
中实现的临时物化只会存活到 range-for 循环的末尾,而原始版本中的
vec
将存活到块的末尾这是宣布的。

无论哪种方式,

f()
都会被调用一次。

在您给出的示例中,任何像样的编译器都会生成完全相同或实际上等效的机器指令。仅当调用

std::vector
的析构函数的确切点很重要时,才会有差异。

© www.soinside.com 2019 - 2024. All rights reserved.