假设我有物理引擎,需要解决前向未知的线性方程大小的系统,但在我知道之后,我不会改变它。一个这样的矩阵可能很容易占用数百千字节。向量的问题在于我从未真正知道它分配了多少空间,而且我不想分配超过需要的空间。
大多数讨论都告诉我们使用std::vector
,但我应该使用std::unique_ptr<T[]>
吗?嗯...也许我需要使用标准分配器this answer建议?
来自标准:
在reserve()之后,capacity()大于或等于的参数 如果重新分配发生,则保留;并等于之前的值 capacity()否则。
所以我不能选择使用预留。
我还发现dynarray
的命题应该处理我的情况,而现在这就是我要采取的方式,如果没有其他命题的话。
答案 0 :(得分:2)
根据你在问题中的说法,我会说std :: vector的使用应该没问题:只要你知道大小,就可以保留你的向量(s)并且不存在额外的开销,因为在该部分中不会再发生任何分配。
当然,由于向量确实在引擎盖下分配了一个原始数组,你也可以在知道大小时立即分配它并在完成后释放它,但是内存增益应该限制为向量结构本身的大小,至少对于一维阵列。
如果你有巨大的多维数组,增益会更高,因为每行(和3-D数组中的每个平面)都有矢量结构,所以使用原始数组而不是大小为n 的矢量n将是 sizeof(向量)
但这是一个低级优化,所以你应该只在所有更高级别的优化已经用完之后担心(例如,只存储对称矩阵的一半)。