C++ 使用C++;14编译器而不是C++;11?

C++ 使用C++;14编译器而不是C++;11?,c++,performance,c++11,c++14,C++,Performance,C++11,C++14,我知道,使用C++11编译器而不是C++03编译器进行编译时,可以获得性能提升(请参见此) 但是当我从C++11编译器变成C++14编译器时,我能期望性能提升吗 如果是这样的话,你能给我看一个代码示例,当用C++14而不是C++11编译时,它会更快。不是天生的。 随着时间的推移,随着编译器在代码生成方面越来越好,您可能会期望性能通常会提高,因此较新的编译器通常会被视为“更好”,并且比较旧的编译器更擅长优化 但是,仅仅通过在C++11和C++14模式之间切换,您会自动获得更快的程序吗?否。C++1

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

但是当我从C++11编译器变成C++14编译器时,我能期望性能提升吗


如果是这样的话,你能给我看一个代码示例,当用C++14而不是C++11编译时,它会更快。

不是天生的。

随着时间的推移,随着编译器在代码生成方面越来越好,您可能会期望性能通常会提高,因此较新的编译器通常会被视为“更好”,并且比较旧的编译器更擅长优化


但是,仅仅通过在C++11和C++14模式之间切换,您会自动获得更快的程序吗?否。

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

一个完全兼容的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;
}
返回在C++14中隐式移动,在C++11中复制

请注意,一个简单的
std::move(m)
将使C++11做与C++14相同的事情,但是“您不
move
返回局部变量”的规则会导致人们避免这种情况(因为它会阻止省略):根据一般规则,这样的“错误”很常见


在C++11中,这个“错误”会导致上述效率低下,但在C++14中它不再是一个错误。

这取决于您的代码。我认为这不取决于语言标准,而是取决于更现代的编译器更好的优化功能。我在这里看到了很多程序花费所有时间调用库函数或I/O的示例,人们想知道编译器是否能使它们更快。如果.01%的时间花在编译器看到的代码上,那么这段时间可能会缩短到0,你永远不会注意到。@πάνταῥεῖ 好吧,有时相同的语法使用更新的语义和相关机制,它们更快(或者可以更快)。我认为这是问题的前提。从这个意义上说,新的标准“可以提高性能”,尽管我带着苦涩的口吻这么说=)。我可以想到至少有一个后C++11可以提高相同代码的性能,但这是通过DR实现的。因此,没有类似于移动语义的更改会导致语言级别的加速?嗯。。。没有新的语义和机制可以让程序更快吗?我的意思是,从03到11,您可以编写一个具有相同语法的代码,并在c++11中使用
move
语义。因此,编写一个得到“提升”的代码是相当容易的。答案是一个强有力的声明,从11到14没有这样的变化。我想知道,从C++11到C++14有什么变化,为什么这不能提高性能?我记得读过一些关于现在编译器可以在比C++11更多的地方移动rahter而不是复制的文章,但是忘记了细节。编译器是否也在其C++11模式中实现了这种行为?像这样的案例还有更多吗?它对答案有什么影响?你的答案是核心语言特定的还是它也考虑了图书馆的进化?谢谢。但由于DR1579是DR,编译器可能也会在C++11模式下实现它;GCC 5.1会这样做。@T.C.即使它是C++14状态DR?或者这是否意味着它是在C++14发布之前发现的缺陷?后者。“C++14”状态意味着分辨率符合C++14标准,而不是针对C++14的DR。
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;
}