提问者:小点点

C 11在效率方面比C 03快吗?[关闭]


想要改进这个问题?更新问题,使其仅通过编辑这篇文章专注于一个问题。

我在贸易公司工作,这里的延迟很重要。分配给我的项目是使用c和c 98部件的混合开发的,但我相信我们可以使用C 11制作相同的项目而不会降低效率。正如与我的前辈讨论的那样,他们说你应该坚持使用C和c 03,因为它们在微观层面上与C 11相比效率更高。有人能突出我吗?如果我使用C 11,我会得到更好的结果吗?


共3个答案

匿名用户

C 11更快,因为引入了对象的移动。主要是在STL中使用此功能大大加快了一些应用程序的速度,而无需更改用户代码中的任何代码。应用程序的编程效率比以前高得多。Constexpr构建也可以导致更快的应用程序启动,因为对象可以驻留在小控制器上的闪存空间中,而不是将它们复制到内存中。还有更多有助于提高代码效率的功能。例如,conatainers的emplace_back有助于在适当的位置生成对象,而不是创建

C 17引入了保证复制省略,这在许多用例中也加快了速度。

匿名用户

这在很大程度上是错误的。

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

其次,使用像auto和“range based for”这样的功能对于效率是中性的。(可能有少数情况下,Range-based-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,但这是一个单独的问题)。

匿名用户

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

更新的版本只改变某些表达式和语句的语法,以及某些关键字的使用,以及引入新的(和有用的)东西,如右值引用(T

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

事实上,更重要的是您选择的算法和您编写的具体实现,以及编译器优化(通常是-O#命令行参数)。有了新标准,您可以使用移动语义学、基于范围的for循环、dectype(auto)(不过这是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;
}

相关问题