我应该使用std :: vector of std :: unique_ptr <t []>如果内存稀疏且我不打算调整大小

时间:2017-04-03 11:20:32

标签: c++ vector memory-management unique-ptr

假设我有物理引擎,需要解决前向未知的线性方程大小的系统,但在我知道之后,我不会改变它。一个这样的矩阵可能很容易占用数百千字节。向量的问题在于我从未真正知道它分配了多少空间,而且我不想分配超过需要的空间。

大多数讨论都告诉我们使用std::vector,但我应该使用std::unique_ptr<T[]>吗?嗯...也许我需要使用标准分配器this answer建议?

来自标准:

  

在reserve()之后,capacity()大于或等于的参数   如果重新分配发生,则保留;并等于之前的值   capacity()否则。

所以我不能选择使用预留。

我还发现dynarray的命题应该处理我的情况,而现在这就是我要采取的方式,如果没有其他命题的话。

1 个答案:

答案 0 :(得分:2)

根据你在问题中的说法,我会说std :: vector的使用应该没问题:只要你知道大小,就可以保留你的向量(s)并且不存在额外的开销,因为在该部分中不会再发生任何分配。

当然,由于向量确实在引擎盖下分配了一个原始数组,你也可以在知道大小时立即分配它并在完成后释放它,但是内存增益应该限制为向量结构本身的大小,至少对于一维阵列。

如果你有巨大的多维数组,增益会更高,因为每行(和3-D数组中的每个平面)都有矢量结构,所以使用原始数组而不是大小为n 的矢量n将是 sizeof(向量)

但这是一个低级优化,所以你应该只在所有更高级别的优化已经用完之后担心(例如,只存储对称矩阵的一半)。