使用C++ 14编译器而不是C++ 11编译时,我会获得性能提升吗?

Rom*_*ain 6 c++ performance c++11 c++14

我知道在使用C++ 11编译器而不是C++ 03编译器进行编译时可以获得性能提升(请参阅此问题).

但是,从C++ 11编译器转换到C++ 14编译器时,我能期望性能提升吗?

如果是这样,你能告诉我一个代码示例,当使用C++ 14而不是C++ 11编译时,代码示例会更快.

T.C*_*.C. 11

C++ 14中有一个核心语言更改,允许实现合并内存分配,请参阅N3664.如果您的编译器/优化器利用此容差,您可能会看到性能提升.


Yak*_*ont 6

完全兼容的C++ 14编译器解决了所有缺陷,至少有一位代码要求它比C++ 11版本更高效.

struct one_byte { char x = 7; };
struct cheap_move {
  std::vector<one_byte> state{1000000}; // 1 mb of state, cheap to move
};
struct test_type {
  test_type(test_type const&)=default;
  test_type(test_type &&)=default;

  // can construct from a cheap_move via either copy or move:
  test_type(cheap_move const&y):x(y){}
  test_type(cheap_move &&y):x(std::move(y)){}

  cheap_move x;
};

test_type test_func() {
  cheap_move m;
  return m;
}
Run Code Online (Sandbox Code Playgroud)

所述return m;在C++ 11兼容的编译器将复制1兆字节的存储器.在实现了缺陷1579的C++ 14编译器中,它将复制3个指针(好吧,移动1个向量).

这是因为在C++ 11中,只有在类型完全匹配时才会出现隐式转换为rvalue.在上面的缺陷报告(列为C++ 14)下,如果存在匹配的rvalue消耗构造函数,则会发生这种情况.所以C++ 14进入返回值,而C++ 11复制到返回值.

(@TC追踪上面的缺陷报告).

请注意,并非所有C++ 14编译器都实现了对该缺陷的修复.此时,在http://coliru.stacked-crooked.com/上的clang和gcc 都没有在C++ 14或C++ 1z模式下实现对该缺陷的修复.

一个不太人为的例子是:

struct modulate {
  std::vector<double> state;
  double operator()(double x)const{
    double r = 0;
    for (double v:state) {
      r*=x;
      r+=v;
    }
    return r;
  }     
};
std::function< double(double) > f( std::vector<double> state ) {
  auto m = modulate{std::move(state)};
  return m;
}
Run Code Online (Sandbox Code Playgroud)

返回隐式地在C++ 14中移动,并在C++ 11中复制.

请注意,一个简单的std::move(m)方法会使C++ 11与C++ 14做同样的事情,但是"你没有move返回局部变量" 的规则会导致人们避免这种情况(因为它会阻止elision):这样的"错误"根据一般规则,这将是常见的.

在C++ 11中,这个"错误"会导致上面的低效率,但它不再是C++ 14中的错误.


Lig*_*ica 5

本质上不是.

随着编译器随着时间的推移在代码生成方面变得更好,你可能会期望性能普遍提高,因此通常会认为较新的编译器"更好",并且比旧编译器更有可能优于优化.

但是你会通过在C++ 11和C++ 14模式之间切换来自动获得更快的程序吗?没有.

  • 我想知道,从C++ 11到C++ 14有什么变化,为什么这不能提高性能?我记得读过一些关于现在的编译器可以在比C++ 11更多的地方移动rahter-than-copy,但忘记了细节.编译器是否也在C++ 11模式下实现了这种行为?是否有更多这样的案例,它如何影响答案?您的答案是核心语言特定的还是它还考虑了图书馆的演变?谢谢. (5认同)