首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在使用C++14编译器而不是C++11进行编译时,性能会得到提升吗?

在使用C++14编译器而不是C++11进行编译时,性能会得到提升吗?
EN

Stack Overflow用户
提问于 2015-04-30 00:23:48
回答 3查看 2K关注 0票数 6

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

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

如果是这样的话,你能给我看一个在用C++14而不是C++11编译时会更快的代码样本吗?

EN

回答 3

Stack Overflow用户

发布于 2015-04-30 00:44:38

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

票数 11
EN

Stack Overflow用户

发布于 2015-04-30 03:11:48

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

代码语言:javascript
运行
复制
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++11兼容编译器中的return m;将复制1兆字节的内存。在实现了defect 1579的C++14编译器中,它将复制3个指针(好吧,移动1个向量)。

这是因为在C++11中,只有当类型完全匹配时,才会发生隐式转换为r值。根据上面的缺陷报告(作为C++14列出),如果存在匹配的消耗右值的构造函数,就会发生这种情况。因此,C++14移入返回值,而C++11复制到返回值。

(@T.C.跟踪了上面的缺陷报告)。

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

一个不太做作的例子是:

代码语言:javascript
运行
复制
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;
}

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

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

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

票数 6
EN

Stack Overflow用户

发布于 2015-04-30 00:29:44

不是固有的。

随着时间的推移,随着编译器在代码生成方面变得更好,您可能会期望性能通常会提高,因此新的编译器通常会被认为是“更好的”,并且比旧的编译器更有可能在优化方面表现出色。

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29949377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档