首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C与C++在内存分配方面的性能比较

C与C++在内存分配方面的性能比较
EN

Stack Overflow用户
提问于 2010-03-25 15:34:27
回答 8查看 8.9K关注 0票数 11

我计划参与一个用C语言编写的代码的开发,用于蒙特卡洛分析复杂问题。这段代码在内存中分配了大量的数据数组来加速它的性能,因此代码的作者选择了C而不是C++,声称用C可以使代码更快、更可靠(关于内存泄漏)。

你同意这一点吗?如果您在计算过程中需要在内存中存储4-16 GB的数据数组,您会选择什么?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2010-03-25 15:41:48

当然是C++。默认情况下,两者之间没有显著差异,但C++提供了一些C语言没有的东西:

  1. constructors/destructors.它们使您可以自动执行大多数内存管理,从而改进reliability.
  2. per-class分配器。这些使您可以根据特定对象的设计和/或使用方式来优化分配。如果您需要大量的小对象(举个明显的例子),这会特别有用。

底线是,在这方面,C绝对没有提供比C++更好的可能性。在最坏的情况下,你可以用同样的方式做完全相同的事情。

票数 24
EN

Stack Overflow用户

发布于 2010-03-25 18:44:05

C99有一个C++所没有的特性,它可以在大量数字处理代码中显著提高速度,这就是关键字restrict。如果您可以使用支持它的C++编译器,那么在进行优化时,工具包中就有了一个额外的工具。不过,这只是一个潜在的好处:充分的内联可以实现与restrict相同的优化,甚至更多。它也与内存分配无关。

如果代码的作者可以演示C和C++代码分配4-16 to数组的性能差异,那么(a)我很惊讶,但好吧,这是有区别的,(b)程序将分配多少次这么大的数组?你的程序实际上是要花费大量的时间来分配内存,还是把大部分时间花在访问内存和进行计算上?与分配时间相比,使用4 4GB阵列实际执行任何操作都需要很长时间,这意味着您应该担心“任何”的性能,而不是分配的性能。短跑运动员非常关心他们离开积木的速度。马拉松跑步者,就没那么多了。

您还必须小心如何进行基准测试。例如,您应该将malloc(size)new char[size]进行比较。如果你在new char[size]()上测试malloc(size),那么这是一个不公平的比较,因为后者将内存设置为0,而前者不是。请改为与calloc进行比较,但还要注意,malloccalloc都可以从C++获得,因为它们确实证明它们的速度要快得多。

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

票数 8
EN

Stack Overflow用户

发布于 2010-03-25 15:41:06

就内存分配而言,C和C++之间没有真正的区别。如果你选择在你的对象上使用虚拟方法,C++会有更多的“隐藏”数据,比如虚拟指针等等。但是在C中分配一个字符数组和在C++中一样昂贵,事实上,它们可能都是使用malloc来实现的。就性能而言,C++为数组中的每个对象调用一个构造函数。请注意,只有当有一个默认构造函数时才会这样做,默认构造函数什么也不做,并且会被优化。

只要您预先分配了数据池,为了避免内存碎片,您就应该准备好了。如果你有简单的POD-structs,没有虚方法,也没有构造函数,那就没有区别了。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2513741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档