C++ C++;容器:最佳内存管理

C++ C++;容器:最佳内存管理,c++,containers,dynamic-memory-allocation,C++,Containers,Dynamic Memory Allocation,我想实现一个容器。数据将存储在动态分配的数组中。我需要关于内存重新分配的建议 基本上,我想要一个公式,当数组满的时候,我应该让它变大多少。我认为常量值是次优的,因为数组越大,复制它所需的时间就越长 例如,如果一个数组可以存储1000000个double,但它已满,则重新分配1000005个double将是愚蠢的。选择1001000是个更好的主意。相反,如果我有一个5个双倍的数组,它已经满了,那么把它扩大到1005个单位也是同样愚蠢的。也许每次都将其放大10%(或者像20+10%那样,这样在小阵列

我想实现一个容器。数据将存储在动态分配的数组中。我需要关于内存重新分配的建议

基本上,我想要一个公式,当数组满的时候,我应该让它变大多少。我认为常量值是次优的,因为数组越大,复制它所需的时间就越长


例如,如果一个数组可以存储1000000个double,但它已满,则重新分配1000005个double将是愚蠢的。选择1001000是个更好的主意。相反,如果我有一个5个双倍的数组,它已经满了,那么把它扩大到1005个单位也是同样愚蠢的。也许每次都将其放大10%(或者像20+10%那样,这样在小阵列上也感觉不错)会是一个更好的主意。对此有什么建议吗?

我将从重用std::vector开始。不要重新实施已经运行良好的内容

如果您知道数据的大小,请使用reserve()函数确保分配的频率不会超过需要的频率。如果您不确切知道自己拥有多少数据,请随意保留20%或40%的额外空间

如果您不知道数据的大小,那么std::vector将在不知道任何情况下优化以获得良好的性能。如果您对数据的大小一无所知,那么您很可能有10001个条目,让vector浪费大量空间,就像您有9999个条目,让vector避免使用不太激进的算法选择的4或5个浪费的副本一样。vector实现在数百个工时内进行了微调,以确保在用户没有大小信息时的最佳行为


唯一一次我会开始偏离这一点是当你开始进入千兆字节的数据集。然后,最好不要分配太大而无法放入内存的内容。

这个问题没有正确的答案。也就是说,当需要重新分配时,AFAIK大多数
std::vector
实现会使vector的当前容量增加一倍。既然您可能正在重新发明一个标准容器,为什么不继续呢?分析您的代码,收集使用数据,开发您自己的容器可能会有多大的预测模型,并使用该模型确定公式。通常的方法是按照@sbabbi暗示的几何级数(例如,这基本上是满足
std::vector
的“摊销常数”要求所必需的)。当前的实现似乎比2更经常地使用系数1.5,但相同的基本思想仍然适用。另请参见。正如Beta和sbabbi所说,没有一般性的答案,因为这在很大程度上取决于如何生成存储在容器中的数据。此外,最优性标准不能是绝对的,但它将取决于各种因素。例如,如果您在一个具有Gib内存的现代工作站上,您可以不断增加为容器保留的内存。但是如果你在一个内存受限的平台上(智能手机?),你也可以考虑收缩一个容器来释放其他数据结构的内存,避免应用程序内存不足的错误。