在效率方面,C ++ 11是否比C ++ 03更快?

时间:2017-11-16 08:20:22

标签: c++ c++11 c++03 low-latency

我在交易公司工作,这里延迟非常重要。分配给我的项目是使用c和c ++ 98部分的混合开发的,但我相信我们可以使用C ++ 11制作相同的项目而不会降低效率。正如我的老年人所讨论的,他们说你应该坚持使用C和c ++ 03,因为它们在微观层面上与C ++ 11相比是有效的。 任何人都可以强调我如果我使用C ++ 11,我会得到更好的结果吗?

4 个答案:

答案 0 :(得分:4)

C ++ 11更快,因为引入了对象的移动。主要是在STL中使用此功能可以在不对用户代码进行任何代码更改的情况下大量加速某些应用程序。应用程序可以比之前更有效地编程。 constexpr构造也可以使应用程序启动更快,因为对象可以驻留在小型控制器上的闪存空间中,而不是将它们复制到ram中。还有很多功能可以帮助提高代码的效率。例如,emplace_back for conatainers有助于生成对象而不是创建&复制它们。

C ++ 17引入了有保证的复制省略,在很多用例中也加速了。

答案 1 :(得分:4)

这大多是错误的。

首先,如果您将C ++ 03兼容源提供给像GCC这样的编译器,那么如果您指定--std=c++03--std=c++11相比,则生成的机器代码不太可能有任何不同。< / p>

其次,使用auto和“基于范围”等功能将保持效率中性。 (可能有少数情况下,基于范围的for将允许编译器比天真循环更有效地优化终止条件的评估,但这些将是罕见的。)

第三,有一些功能(如移动语义)对效率有积极作用。

最后,在某些情况下天真编写的C ++ 11将比等效的C ++ 03代码更少更高效。例如:

std::vector<std::vector<big_struct>> big_2d_array;
for (auto v : big_2d_array)
    do_stuff(v);

这将复制 v并且费用昂贵。它必须是:

for (auto &v : big_2d_array)
    do_stuff(v);

请注意参考。 (我也建议const,但这是一个单独的问题。)

答案 2 :(得分:0)

C ++ - 语言 - 没有超出复杂性限制的任何性能保证O(*)用于各种操作 - 主要是容器,以及&#34;你不会为你所做的事情支付费用的一般概念#39; t使用&#34;。

对此没有重大改变(除了可能在一些地方更适合的新容器类型)。

[编辑]我忘记了:移动语义可以显着加快现有代码库的速度,而无需任何更改。 (但是,如果你一直在挤压周期,你可能不会受益。)

然而(在C ++中总是有一个)编译器通常有所改进。显着的性能提升的显着来源是链接时代码生成和自动矢量化等新技术,这些技术变得更加广泛和精致,并且更好地支持当代CPU架构。

针对编译器升级仅说明研究和测试的风险和成本。

直觉:你的老年人回避风险和变化。

与微观层面的C ++ 11相比,

&#34; C和c ++ 03 [更多]效率更高[&#34; 是公牛。除非你的老年人没有费心去学习20年前推出的新奇东西。

答案 3 :(得分:-1)

老实说,这高度依赖于特定的代码段。 C ++ 11只是C ++语言标准的新版本(ISO / IEC 14882:2011)。

较新的版本仅更改某些表达式和语句的语法,某些关键字的使用,以及引入新的(和有用的)内容,例如rvalue referenceT&&),{{3 (autodecltype),auto type deductiontemplate <typename... Args>)等等。尽管某些介绍可能会帮助您编写更高效的代码(例如variadic template parameters),但实质上并不会改变编译器从C ++源代码生成CPU指令所需的方式

因此,在微指令级别,来自相同源的编译指令在C ++ 98 / 0x / 11下大部分保持不变,因此应该是性能上的任何可观察的差异。

实际上重要的是您选择的算法和编写的特定实现以及编译器优化(通常是-O#命令行参数)。使用新标准,您可以使用移动语义编写更快的代码move semanticsrange-based for loop(这一个是C ++ 14,但是)

实际上,当语言标准是提供给编译器的唯一不同选项时,此代码生成完全相同的汇编代码:

#include <iostream>
using std::cout;
using std::endl;

int main() {
    cout << "Hello world" << endl;
    return 0;
}

但是当你开始使用STL时,它总是尽可能使用最新的功能,那么它开始有所作为:

#include <iostream>
#include <string>
using std::string;

string getString(void) {
    string str("");
    for (int i = 0; i < 100000; i ++)
        str.append("A");
    return str;
}

int main() {
    std::cout << getString() << std::endl;
    return 0;
}