我想知道现代编译器及其优化是否仍然值得用 C 而不是 C++ 编写一些关键代码以使其更快。
我知道如果类被复制而可以通过引用传递,或者当类由编译器自动创建时,通常使用重载运算符和许多其他类似情况,C++ 可能会导致性能下降;但是对于一个知道如何避免这一切的优秀 C++ 开发人员来说,是否仍然值得用 C 编写代码来提高性能?
我想知道现代编译器及其优化是否仍然值得用 C 而不是 C++ 编写一些关键代码以使其更快。
我知道如果类被复制而可以通过引用传递,或者当类由编译器自动创建时,通常使用重载运算符和许多其他类似情况,C++ 可能会导致性能下降;但是对于一个知道如何避免这一切的优秀 C++ 开发人员来说,是否仍然值得用 C 编写代码来提高性能?
我会同意很多评论。在 C++ 中有意支持 C 语法(仅在 C99 中存在分歧)。因此所有 C++ 编译器都必须支持它。事实上,我认为很难再找到任何专用的 C 编译器了。例如,在 GCC 中,无论代码是 C 还是 C++,您实际上最终都会使用相同的优化/编译引擎。
真正的问题是,编写纯 C 代码并用 C++ 编译是否会降低性能。答案是,出于所有意图和目的,不。关于异常和 RTTI 有一些棘手的问题,但主要是大小变化,而不是速度变化。您将很难找到一个实际上会影响性能的示例,以至于编写专用模块似乎不值得。
关于您使用什么功能的说法很重要。在 C++ 中,很容易对复制语义感到草率,并因复制内存而承受巨大的开销。以我的经验,这是最大的成本——在 C 语言中,您也可能遭受这种成本,但我不会说那么容易。
虚函数调用比普通函数稍微贵一点。同时强制内联函数比普通函数调用便宜。在这两种情况下,从堆栈中推送/弹出参数的成本可能更昂贵。虽然担心函数调用开销应该在优化过程中很晚才出现——因为它很少是一个重大问题。
异常在抛出时代价高昂(至少在 GCC 中)。但是设置 catch 语句和使用 RAII 并没有与之相关的大量成本。这是在 GCC 编译器(和其他编译器)中设计的,因此真正只有例外情况是昂贵的。
但总而言之:一个优秀的 C++ 程序员不能仅仅通过用 C 编写代码来使他们的代码运行得更快。
措施! 在考虑优化之前测量,在应用优化之前测量,在应用优化之后测量,测量!
如果您必须以 1 纳秒的速度运行您的代码(因为它将被 1000 人使用,在接下来的 1000 天内将使用 1000 次,并且那一秒非常重要),任何事情都会发生。
是的!值得的 ...
-f
选项)你不能忘记的是测量!.
pmg 搞定了。只是测量而不是全局假设。也可以这样想,像 gcc 这样的编译器将前端、中间和后端分开。因此,如果您愿意,前端 fortran、c、c++、ada 等最终会采用相同的内部中间语言,这是获得大部分优化的原因。然后将通用中间语言转换为特定目标的汇编程序,并且会发生特定于目标的优化。因此,当语言差异很大时,该语言可能会或可能不会从前端到中间引入更多代码,但对于 C/C++,我认为它是相同或非常相似的。现在二进制大小是另一回事,即使只有 C 语法也可能/将变化,库可能会被吸入仅 C 与 C++ 的二进制文件中。不一定会影响执行性能,但如果程序在一段时间内加载到 ram 中,可能会增加程序文件的存储和传输差异以及内存需求。再次,只需测量。
我还在测量注释中添加了编译到汇编器和/或反汇编输出并比较不同语言/编译器选择的结果。这可以/将补充您在测量时看到的时间差异。
这个问题已经回答死了,所以我不会补充。
只是作为一个通用问题,假设您已经测量等,并且您已经确定某个 C++(或其他)代码段没有以最佳速度运行(这通常意味着您没有使用正确的工具来完成这项工作);并且您知道通过用 C 编写它可以获得更好的性能,那么是的,当然,这是值得的。
有一种常见的心态,试图用一个工具(Java、SQL 或 C++)做所有事情。不仅仅是马斯洛的锤子,而是他们可以用 Java 编写 C 构造的实际信念,等等。这导致了各种性能问题。架构,作为一个真正的职业,是将代码段放置在适当的架构位置或平台上。将提供性能的是 Java、SQL 和 C 的正确组合。这会产生一个不需要重新访问的应用程序;顺利执行。在这种情况下,C++ 是否或何时实现这个或那个构造函数并不重要。
我想知道现代编译器及其优化是否仍然值得用 C 而不是 C++ 编写一些关键代码以使其更快。
不。保持可读性。如果您的团队更喜欢 c++ 或 c,则更喜欢它 - 特别是如果它已经在生产代码中运行(如果没有很好的理由,不要重写它)。
我知道如果类被复制而可以通过引用传递,C++ 可能会导致性能下降
然后禁止复制和分配
或者当编译器自动创建类时,通常使用重载运算符和许多其他类似情况
你能详细说明一下吗?如果您指的是模板,它们在运行时不会产生额外的成本(尽管它们会导致额外的导出符号,从而导致更大的二进制文件)。事实上,如果(例如)需要转换,使用模板方法可以提高性能。
但是对于一个知道如何避免这一切的优秀 C++ 开发人员来说,是否仍然值得用 C 编写代码来提高性能?
根据我的经验,专业的 c++ 开发人员可以创建更快、更易于维护的程序。
您必须对您使用(和不使用)的语言功能有所选择。如果您将 c++ 功能分解为 c 中可用的集合(例如,删除异常、虚函数调用、rtti),那么您就有了一个良好的开端。如果您学习使用模板、元编程、优化技术、避免类型别名(这在 c 中变得越来越困难或冗长)等,那么您应该比 c 更快 - 使用更容易维护的程序(因为您熟悉c++)。
如果您习惯使用 c++ 的功能,请使用 c++。它有很多特性(其中许多特性是在考虑速度/成本的情况下添加的),并且可以写成与 c 一样快(或更快)。
使用模板和元编程,您可以将许多运行时变量转换为编译时常量以获得非凡的收益。有时这很好地进入了微优化领域。