【发布时间】: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;即使被绕过,它也会增加一些重量,但它通常很有用。
标签: c++ c comparison performance