C++ 程序真的比类似的 C 程序慢吗? [关闭]

Posted

技术标签:

【中文标题】C++ 程序真的比类似的 C 程序慢吗? [关闭]【英文标题】:Is a C++ program really slower than a similar C program? [closed] 【发布时间】:2010-08-15 12:12:40 【问题描述】:

假设我用 C++ 编写了一个程序,没有使用 RTTI 和运行时多态性(没有虚函数,没有虚继承),并且类没有私有/受保护的成员,也没有使用 C++ 特定的头文件(即使用 C 头文件:cstring, cstdio, ... 而不是 string, iostream, ...)。

然后我想用C编写一个类似的程序,其中函数的第一个参数类型对应于相关的struct

例如:

//C++ code

struct Custom

    int a;
    Custom()  
    void change()  
    ~Custom()  
;

int main()

    Custom m; //init m
    m.change();
    //destroy m


/*C code*/

struct Custom

    int a;
;
void custom_init(Custom* like_this)  
void custom_change(Custom* like_this)  
void custom_destroy(Custom* like_this)  

int main()

    Custom m;
    custom_init(&m);
    custom_change(&m);
    custom_destroy(&m);

C++ 程序是否比类似的 C 程序慢(通常)?如果是,那么为什么 C 程序更快呢?我知道,C++使用RAII设计模式进行内存管理,是不是慢的原因?

我听说有人说 C 程序更快……为什么?

编辑:为什么这个问题被关闭了?我想知道 c++ 是否做了一些我们不需要的额外操作,以及它如何影响性能(让它变慢?更快?还是什么都没有?)。

【问题讨论】:

答案取决于编译器/平台/硬件。只需编译这两个程序,基准测试。此外,在某些情况下,可能不值得增加速度。 不要关闭。每次与 C 比较时不要生气。我想知道是否有任何情况是这种情况。 其实对于这样一个短命的程序来说,C++运行时库比C库大,C++程序很可能会慢一些。我必须承认我觉得谈论无效和 RAII 很有趣,RAII 不会影响性能,它会影响正确性。 @PC2st:您的 c 代码实现了与 RAII 相同的目标,即资源管理。如果您必须在使用对象后初始化或清理它,您可以在 c++ 中编写 ctor/dtor 并在 c 中编写 init/destroy 方法并调用它们。 c++ 通过在每次创建或销毁对象时调用构造函数和析构函数来隐式进行资源管理。使用 c 并不能消除对资源管理的需求,因此 c 代码必须与 c++ 代码相同,只需显式调用 init 和 destroy。 一个熟练的工人可能能够通过使用没有任何联锁装置、防护装置或其他安全装置的设备更快地工作(至少在他致残之前),但这种装置提供的保护通常是值得的它带来了轻微的麻烦。有时,使用所有正常的安全装备来完成任务是不切实际的;这种情况在必要时必须非常小心地处理,并且通常最好避免,但有时绕过安全装置确实是最好的方法。 C++ 是带有额外安全装置的 C;即使被绕过,它也会增加一些重量,但它通常很有用。 【参考方案1】:

C++ 不使用 RAII。您可以在您的 c++ 程序中使用 RAII。 只要你在 C++ 和 C 中做同样的事情, 两个程序都应该一样快。 用 C 或 C++ 编写快速程序不是编程语言的问题,而是你使用哪种功能的问题。

【讨论】:

如果我们不使用指针,比如上面例子中的m变量,C++使用RAII来分配和释放它的内存(当构造函数发生错误时,分配的内存将是freed)(如果类初始化后发生错误,会自动调用析构函数)。 @PC2st 仅仅因为它像 RAII 一样工作并不意味着它就是 RAII。 @PC2st 当你说如果发生错误时,你的意思是如果抛出异常对吗?这意味着您正在使用 C 中不会使用的额外功能。如果您希望比较有意义,您必须要么不使用异常,要么在 C 中实现异常处理。【参考方案2】:

除非你尝试过,否则你永远不会知道。如果 C++ 使用 C 不使用的任何东西(例如构造函数、析构函数甚至非虚拟方法),它可能会更慢。

但差异可能会小到无法察觉。

C++ 的早期实现可能比 C 慢,但这是任何软件的本质。它会随着时间的推移而改善。

衡量,不要猜测!分析您的特定代码以查看哪个更快。但是,即使 C 代码 更快,失去所有这些额外功能的代价也可能太大了。执行速度只是一种速度,很少是重要的。 我的认为哪个速度最重要的是开发速度。

【讨论】:

感谢您的回答,但我想知道 c++ 是否会做一些我们不需要的额外操作,以及它如何影响性能(使其变慢?或什么都没有?)。例如,RAII 做了什么让 C++ 变慢? (或可能不会)以及 C++ 可能会使其比 C 慢(或可能不会)的其他事情。 @PC2st,如果你想知道,那就测试一下。这将取决于实施。我可以很容易地编写一个生成代码比 g++ 慢的 C 编译器(这实际上很可能是因为,根据汇编程序的输出,g++ 的人比我更了解优化)。 Crikey,我可以编写一个 C 编译器,其代码运行速度比 GWBASIC 慢 :-) 除非您开始比较 具体实现(以便可以收集实际数据而不是人们的轶事),否则这个问题似乎毫无意义。 【参考方案3】:

不,这几乎可以肯定是错误的。 RAII 本身不会使程序变慢。 C 和 C++ 编译器可能会为这些示例生成几乎相同的代码。

【讨论】:

以上是关于C++ 程序真的比类似的 C 程序慢吗? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Matlab 仍然比 C++ 中的 opencv 慢吗

我的 iphone 应用程序加载速度比其他类似的应用程序慢 [关闭]

在 Android 上部署 Qt 应用程序真的很慢吗?

WKWebView 的网络性能比原生 safari 慢吗?

chrome“appendChild”真的那么慢吗?

“cudaMallocManaged”比“cudaMalloc”慢吗?