c++ - 如何设计适合数百万分配的类?

标签 c++ performance oop

如果我想分配一个类Foo 的数百万个对象,并且我希望内存和时间高效,我应该如何设计Foo 类?

显然,Foo 不应包含太多成员数据。

另外,我猜,它不应该使用虚函数?

Foo 从基类派生的成本是多少?来自几个基类?

还有其他技巧可以使数百万个 Foo 对象非常高效吗?

最佳答案

我认为关于为数百万个分配设计类没有什么可说的。是的,有明显的内存限制,所以如果您有固定数量的内存,这可能是您真正关心的问题,否则您将始终面临内存不足的风险。指向虚拟表的指针就是一个指针(在 32 位或 64 位体系结构上为 4 或 8 个字节),不确定多重继承中是否属于这种情况。调用虚拟函数有虚拟查找的开销(如果您最近没有使用它,还有额外的缓存未命中),但仅适用于虚拟函数,并且它们可能永远不会被内联。

如果有很多重复值,您可能还需要考虑使用单独的数据结构(享元模式)。为了提高效率,请确保您拥有轻量级(内联)构造函数和赋值运算符,尤其是如果您打算使用 STL vector 和类似内容。

这些都是非常简单的东西,所以现在我的真正建议是:

真正会扼杀你的内存管理的是如果你得到碎片,你可能突然有一堆内存,但仍然无处放置你的对象(没有足够的连续空间)。如果你有很多交错分配,这可能会变成一个真正的问题,所以你可能想考虑分配大块对象,将它们保存在池中并重用。或者使用自定义分配器(新运算符),在其中预分配一个内存块,该内存块是您的对象大小的倍数,并将其用于您的对象。

关于c++ - 如何设计适合数百万分配的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2397168/

相关文章:

c++ - 我可以在 C++ 中使用指针访问二维数组的元素吗?

c++ - 从原始指针构造时 shared_ptr 是否分配?

c++ - 从 C++ 调用 Lua 函数不使用 2 个定义的函数

c# - 在单独的线程中延迟编译 .NET 正则表达式

c# - 强制方法不返回 null

c++ - SDL2 两个窗口在不同的线程

java - 从 Oracle 数据库中获取大量数据到 Java 对象的最快方法是什么

sql - JOIN 比 WHERE 更快吗?

java - 如何计算对象中的某些属性

php - 未定义索引 : file