如果内存稀疏并且我不打算调整大小,我应该使用 std::vector 还是 std::unique_ptr<T[]>

Should i use std::vector of std::unique_ptr<T[]> if memory is sparse and i'm not going to resize

假设我有一个物理引擎需要求解正向未知的线性方程组,但在我知道之后,我不会改变它。一个这样的矩阵可能很容易占用数百千字节。 vector 的问题是我从来不知道它分配了多少 space 而且我不想分配超过需要的部分。

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


来自标准:

After reserve(), capacity() is greater or equal to the argument of reserve if reallocation happens; and equal to the previous value of capacity() otherwise.

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

我还发现 dynarray 的提议应该已经处理了我的案子,现在这就是我要采取的方式,如果没有其他提议的话。

根据您在问题中所说的,我认为 std::vector 的用法应该没问题:只要知道大小,就可以 reserve它在你的向量中,不会有额外的开销,因为在那个部分永远不会再发生分配。

当然,由于 vector 确实会在后台分配原始数组,您也可以在知道大小后立即分配它,并在完成后释放它,但内存增益应限于 vector 的大小结构本身,至少对于一维数组。

如果你有巨大的多维数组,增益会更高,因为你将在每行(和 3-D 数组中的每个平面)上有一个向量结构,所以使用原始数组而不是大小为 n[ 的向量=18=]n 将是 nsizeof(vector)

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