想要改进这个问题?更新问题,使其仅通过编辑这篇文章专注于一个问题。
我在贸易公司工作,这里的延迟很重要。分配给我的项目是使用c和c 98部件的混合开发的,但我相信我们可以使用C 11制作相同的项目而不会降低效率。正如与我的前辈讨论的那样,他们说你应该坚持使用C和c 03,因为它们在微观层面上与C 11相比效率更高。有人能突出我吗?如果我使用C 11,我会得到更好的结果吗?
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;
}