使用潜在共享对象循环转换

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::sizestd::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呢?显然,我可以将函数抛给编译器,看看会发生什么,但这是检查一致性的糟糕方法.

Oli*_*rth 5

正如你所链接的答案之一中所述,"编译器并不关心其他线程".除非您具有std::vector显式线程同步构造的实现,否则这不会影响优化.