Den*_*ose 5 c++ optimization c++11
请考虑以下代码:
#include <vector>
int sum(const std::vector<int>& v) {
int count = 0;
for(int i = 0; i < v.size(); ++i)
count += v[i];
return count;
}
Run Code Online (Sandbox Code Playgroud)
出于这个问题的目的,假设这是整个翻译单元,编译器的实现std::vector::size和std::vector::operator []可用.
编译器可以简单地告诉它v在循环中没有被修改,因为除了源代码之外没有函数调用.因此,编译器size()在循环外提升调用是完全合理的:
for(int i = 0, size = v.size(); i < size; ++i)
Run Code Online (Sandbox Code Playgroud)
但是,在最近的一个答案中,有人建议,由于v可能被另一个线程修改,因此不允许编译器执行该优化.然而,在我看来,在这种情况下,函数已经被遗忘了,因此限制编译器的选项是没有意义的.但我不明白新标准关于排序的规则,以及它们如何与表达式重新排序相互作用,所以也许我的直觉是错误的.
我愿意假设在C++ 03中,这种转换总是有效的.但是C++ 11呢?显然,我可以将函数抛给编译器,看看会发生什么,但这是检查一致性的糟糕方法.