【问题标题】:Efficient memory allocation before iterative algorithm迭代算法之前的高效内存分配
【发布时间】:2020-01-28 21:40:25
【问题描述】:

我正在尝试实现一种算法(C++),它的结构基本如下:

  1. 构建包含

    的数据结构

    a) 向量(双精度)

    b) vector(vector(double)) (表示一个稀疏矩阵A,内向量 大小先验未知,也不相同)

  2. 运行迭代算法,对这些算法执行大量计算 结构

为了提高效率,我想确保在第二部分开始之前优化内存分配,因此如果可能,存储在 A 中的向量在内存中彼此相邻,没有任何开销或任何东西。有什么好办法吗?

【问题讨论】:

  • 根据您的描述,您可以对所有数据使用单个向量,并使用一个单独的指向行的指针向量。虽然通常稀疏矩阵在两个方向上都是稀疏的,所以这可能还不够。
  • vector<vector<double>> 不足以表示一般的稀疏矩阵。

标签: c++ memory vector


【解决方案1】:

如果您想更高效地创建向量,您可以使用vector::reserve,如果将数据附加到向量,则可以减少重新分配。

对向量的访问总是尽可能高效。 std::vector 中的数据是连续保存的。这意味着对于大量数据,内部向量是否相互关联是无关紧要的,因为它需要相同数量的取消引用。

总的来说,我会说 STL 非常高效,但除了 reserve 之类的功能之外,您无法对其进行太多优化。

如果您需要更高的速度,则必须使用针对您的用例优化的数据结构。

【讨论】:

  • 谢谢,我明白了。那么下面的代码呢:vector(vector(double)) A; A = build_A(); // 这里我知道每个内部向量的维数 vector(vector(double)) A_efficient; A_efficient.reserve(A.size()) for(int i = 0; i
  • Reserve 仅优化向向量中插入新元素。如果您已经创建了包含所有数据的 A,则可以使用它而不会出现任何性能问题。储备可用于优化向量 A 的创建。
  • 这让我有点困惑。当我创建 A 向向量添加条目时,有时我可能会向 A[i] 添加一些东西,然后向 A[j],.. 所以将内存视为堆栈,A 怎么可能[i] 是连续存储的?
  • 如果你将数据推送到没有容量保存它的std::vector,它将分配更多内存并将现有数据复制到新内存(最坏情况下)。
猜你喜欢
  • 2014-04-28
  • 1970-01-01
  • 2019-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-14
  • 2011-11-15
  • 1970-01-01
相关资源
最近更新 更多