除了移动语义之外,什么是一些可以提高代码性能的C ++ 11特性?

时间:2014-01-16 00:47:17

标签: c++ performance c++11

移动语义具有巨大的性能提升。 C ++ 11的其他功能是否有助于获得更好的性能?

3 个答案:

答案 0 :(得分:5)

如果你有足够的动力优化代码并编写自己的组件,我强烈怀疑C ++ 11中没有新功能(包括移动语义)可以实现你无法完成的性能提升你自己在C ++ 03。

如果你的意思是“免费”获得性能改进,而根本不修改现有的C ++ 03代码,那么除了移动语义之外,可能还有一些小而相当无聊的库调整。例如,将std::list::size更改为保证O(1)将使用GNU libstdc ++加速某些程序并减慢其他程序。

但是,不能有很多数字,只是因为没有非常许多C ++ 11功能改变了格式良好的C ++ 03程序的含义。

答案 1 :(得分:3)

我唯一能想到的是constexpr,它可以使你的一些表达式在编译时计算,而不是之前的。也就是说,它们必须是如此简单的表达式,以至于它们不会完全影响您的C ++ 03程序,而且性能会受到影响。

因此我将使用,除非您计算添加的标准容器对于某些类型的数据比预先存在的标准容器(例如unordered_map)更快虽然这些在C ++ 03中总是可以用手动或库代码实现。

答案 2 :(得分:3)

Variardic template和完美转发让您可以为C ++ 03中需要2^n手动或宏生成函数的其他代码创建简单包装。

相同的技术允许表达式template避免在提取最终值之前复制任何数据。

C ++ 11的细粒度内存模型比许多非标准库更好:在C ++ 11之前没有扩展,它们都不存在。在许多应用程序中,std::atomic可以胜过互斥锁保护计数器。简单地使用std::async可以轻松地在C ++标准中编写并行算法。

智能指针非常高效,用它们取代你的内存管理可以为你提供支持。

unordered关联容器,当您不需要订单时,比订购容器快得多。

for(auto&&a:b)循环可以比你自己写的循环更快。您也可以非常轻松地为自己的容器公开循环。

转发构造函数可以轻松构建数据一次,而不是构建然后初始化。

初始化列表允许您像数组一样初始化数据,而无需创建该数组。

constexprtemplate改进(主要是variardic,还有decltype)允许您将更多逻辑移动到编译时间,这可以使编译器更好地优化其他代码。 / p>

用户定义的文字允许您跳过从基本类型转换的运行时成本。

lambdas让你创建自己的控制流'body',它可以将基于仿函数和模板的控制流从钝角变得容易和透明。从简单的异步代码到像素操作的应用程序自动升级到扫描行操作,然后发送到图形引擎,发送到文档树的访问者代码 - 所有这些都易于使用,并且经常实现。

现在,这些(包括move)都不允许你做你以前做不到的事情:所有编程语言都是等价的,直到一个恒定的因素。 C ++的C伪子集功能强大,足以模拟给定的C ++ 11程序执行的代码很多很多代码(禁止线程化,但C ++ 11中没有任何东西在某个扩展库中没有) 。 C ++ 11提供了很多方法来轻松地 来完成高性能的事情。