【问题标题】:2D vector vs 1D vector2D 向量与 1D 向量
【发布时间】:2016-12-30 17:22:42
【问题描述】:

在 C++11 中,2D 向量与 1D 向量在时间方面的关系如何?
在给定的 2D 向量中,所有内部向量的大小相同。

例如:

std::vector<std::vector<int>> X{10, std::vector<int>(4)};

对比

std::vector<int> Y(40);

当元素被随机访问时,向量的哪个头像会表现得更好?

【问题讨论】:

  • 与任何时间测量一样,您必须在您关心的系统上进行测量。
  • @merlin2011 我想知道 C++ 优化 2D 矢量与 1D 相比有什么不同。我很担心,因为我的几次运行和 C++11 方面的不那么专业可能最终会让我做出错误的假设。
  • 任何性能测量的第一条规则是第一次测量总是错误的。但这就是为什么我们一直在测量,直到我们有理由相信为止。 :P

标签: c++ c++11 vector stl


【解决方案1】:

单个std::vector 本质上更简单,它只是存储在某处的连续内存块。

std::vector 中的std::vector 开销更大,但也更强大(例如,每个内部向量可以有不同的大小)。

应针对您的特定使用模式对随机访问性能进行彻底的基准测试,但主要区别在于:

  • 使用单个向量,您只需计算 size_t index = x + y*WIDTH 并访问元素
  • 嵌套向量有两层间接,首先必须获取包含内向量的内存,然后必须获取内向量数据的内存。

【讨论】:

  • 是的,额外的间接级别会导致额外的内存访问,这会减慢速度,有时是现代系统中的重要因素。在现在过时的 CPU 上,额外的间接寻址有时会更快,因为相对于内存访问而言,乘法可能非常耗时。有时会看到 20 多年前编写的代码就是这样做的。这些天通常是不好的做法,除非需要可变的行大小。
  • 如果您在编译时知道任何内部或外部大小,请使用,例如,std::array&lt;std::vector&lt;int&gt;, 4&gt;。如果您真的很追求性能,您可以拥有一个新的矩阵类型,或者作为独立类型,或者,从std::vector&lt;T&gt; 派生或组成。如果你打算做后者,请阅读这个link
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 2018-06-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-23
  • 1970-01-01
相关资源
最近更新 更多