C++程序真的比类似的C程序慢吗?

5
假设我已经用C++编写了一个程序,没有使用RTTI和运行时多态性(没有虚函数,没有虚继承),类没有私有/保护成员,也没有使用C ++特定的头文件(即使用C头文件:cstringcstdio,...而不是stringiostream,...)。
然后我想用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++是否做了一些我们不需要的额外操作,以及它如何影响性能(使其变慢?变快?还是没有影响?)。


1
答案取决于编译器/平台/硬件。只需编译两个程序并进行基准测试即可。另外,在某些情况下,意外造成巨大损失的可能性可能不值得为了更快的速度而冒险。 - SigTerm
6
不要关闭。每次将某物与C语言进行比较时,不要生气。我个人想知道是否有任何情况是这样的。 - Matt Joiner
2
实际上,对于这样一个短暂的程序来说,C++运行时库比C库更大,因此C++程序可能会稍微慢一些。我必须承认,谈论无效性和RAII让我感到有趣,RAII不影响性能,它影响正确性。 - Matthieu M.
2
@PC2st:你的C代码实现了与RAII相同的目标,即资源管理。如果你需要初始化一个对象或者在使用完后清理它,你可以在C++中写一个构造函数/析构函数,在C语言中写一个init/destroy方法,并调用它们。C++通过在创建或销毁对象时调用构造函数和析构函数来隐式地进行资源管理。虽然使用C语言不会消除对资源管理的需求,但是C代码将需要显式调用init和destroy方法来完成与C++代码相同的操作。 - josefx
1
一位熟练的工人可能会通过使用没有任何互锁、防护或其他安全装备的设备来更快地工作(至少直到他自己受伤),但是这些装备提供的保护通常比它所施加的轻微麻烦要更有价值。偶尔,使用所有正常的安全装备来完成任务可能是不切实际的;在必要时必须非常小心地处理这种情况,并且通常最好避免,但有时绕过安全装备确实是最佳方法。C++是带有额外安全装备的C语言;即使被绕过,它也会增加一些负担,但通常很有用。 - supercat
显示剩余5条评论
3个回答

6

C++没有使用RAII,但你可以在C++程序中使用RAII。
只要你在C++和C语言中执行的是完全相同的操作,两个程序的速度应该是完全一样的。
在C或者C++中编写快速的程序并不取决于编程语言,而是取决于你使用的特性。


1
如果我们不使用指针,就像上面的示例中的m变量一样,C++会使用RAII来分配和释放它的内存(当在构造函数中发生错误时,分配的内存将被释放)(并且如果在类初始化之后发生错误,析构函数将自动调用)。 - Sadeq
1
@PC2st 只是因为它的工作方式类似于 RAII,并不意味着它就是 RAII。 - SoapBox
1
@PC2st 当你说如果出错了,你是指抛出异常,对吗?这意味着你在使用一项你在 C 中不会使用的额外功能。如果你想让比较有意义,你必须要么不使用异常,要么在 C 中实现异常处理。 - log0

4

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

但是差异可能如此之小以至于无法察觉。

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

量化而非猜测!对您的特定代码进行性能分析,看看哪个更快。但即使C代码更快,失去所有额外功能的代价可能太大了。执行速度只是其中一个速度,很少是重要的速度。 认为最重要的速度是开发速度。


谢谢你的回答,但我想知道C++是否会做一些我们不需要的额外操作,以及它如何影响性能(使其变慢?还是没有影响?)。例如,RAII做了什么使C++变慢了吗?(或者可能没有)还有其他可能使C++比C变慢的事情(或者可能没有)。 - Sadeq
@PC2st,如果你想知道这个问题的答案,那就测试一下吧。这会取决于实际的实现。我可以很容易地编写一个 C 编译器,它生成的代码比 g++ 更慢(基于汇编输出,g++ 的开发人员对优化更有知识),而且我甚至可以写一个 C 编译器,其代码运行速度比 GWBASIC 还要慢 :-) 除非你开始比较_具体的实现_(这样就可以收集实际数据而不是人们的轶事),否则这个问题似乎毫无意义。 - paxdiablo

2
不,几乎可以确定这是错误的。仅靠RAII本身不会使程序变慢。无论是C还是C++编译器,它们都可能为这些示例生成几乎相同的代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接