C与C++在内存分配方面的表现

And*_*rei 11 c c++ performance memory-management

我计划参与开发用C语言编写的代码,用于蒙特卡罗对复杂问题的分析.这段代码在内存中分配了巨大的数据数据以加速其性能,因此代码的作者选择了C而不是C++声称可以用C做出更快更可靠(关于内存泄漏)的代码.

你同意吗?如果您需要在计算期间将4-16 GB的数据阵列存储在内存中,您会选择什么?

Jer*_*fin 23

绝对是C++.默认情况下,两者之间没有显着差异, C++提供了一些C没有的东西:

  1. 构造函数/析构函数.这些可以让您自动化大多数内存管理,提高可靠性.
  2. 每类分配器.这些允许您根据特定对象的设计和/或使用方式优化分配.如果您需要大量小对象(这是一个明显的例子),这可能特别有用.

最重要的是,在这方面,C绝对没有提供比C++更优势的可能性.在最糟糕的情况下,您可以以相同的方式完成相同的事情.

  • @paxdiablo:当然,如果你必须初始化,你必须初始化它是在构造函数中还是在其他地方的代码块中.如果需要初始化内存,则必须分配_and_ initialize.如果您不需要初始化,则不需要用户声明的构造函数,并且实现可以优化其生成的构造函数. (6认同)
  • 呃,如果你正在使用构造函数和析构函数,那么C++肯定会变慢,因为它必须分配*和*初始化. (3认同)
  • ......在C++中,可靠性要好得多.即使你只使用C++的C子集,你也可以使用几个RAII对象来帮助处理复杂函数中的内存泄漏(多次返回,潜在的错误快捷方式......),代码将更加可靠. (3认同)
  • @paxdiablo:这是我根据引用的性能和可靠性标准选择的.C++并不*绝对*在性能上有优势,但在最坏的情况下它可以提供完全相同的性能,并且大约90%的时间它至少会有一点点优势. (2认同)

Ste*_*sop 8

C99中有一个功能,它不存在于C++中,并且可能会在繁重的数字运算代码中显着提高速度,这就是关键字restrict.如果您可以使用支持它的C++编译器,那么在优化时您可以在套件中使用额外的工具.但这只是一个潜在的收获:足够的内联可以允许相同的优化restrict.它也与内存分配无关.

如果代码的作者能证明分配4-16GB阵列,那么C和C++代码之间的性能差异(一)我很惊讶,但OK,有区别,和(b)有多少被程序会分配这么大的数组?您的程序实际上是否会花费大量时间来分配内存,还是花费大部分时间来访问内存和进行计算?与分配时间相比,使用4GB阵列实际执行任何操作需要很长时间,这意味着您应该担心"任何事情"的性能,而不是分配的性能.短跑运动员非常关心他们下车的速度有多快.马拉松运动员,不是那么多.

您还必须小心如何进行基准测试.你应该比较malloc(size)一下new char[size].如果您测试malloc(size)new char[size]()那么它是不公平的比较,因为后者将内存为0,前者没有.对比较calloc代替,还要注意malloccalloc都可以从C++中(不可能),他们证明可测量更快.

但是,最终,如果作者"拥有"或启动了该项目,并且更喜欢用C而不是C++编写,那么他不应该用可能虚假的性能声明来证明这个决定,他应该通过说"我更喜欢C"来证明这一点. ,这就是我正在使用的".通常,当有人就这种语言表现做出这样的声明,并且结果证明测试不是真的时,您会发现表现并不是语言偏好的真正原因.证明声明错误实际上不会导致该项目的作者突然开始喜欢C++.