【问题标题】:Is a vector of arrays contiguous?数组向量是否连续?
【发布时间】:2021-04-05 14:11:30
【问题描述】:

如果我创造

std::vector<std::array<double, 2>> points;
std::vector<double> points2;

我知道 points2 将是一个连续的内存块,在堆中保存双精度数。我认为这些点将是堆栈的 double* 的连续内存块?但是这些数组在堆栈中会是连续的吗?假设我存储了成对的双精度来表示一些点。

points2 在内存中是这样的:[x0 y0 x1 y1 x2 y2 ...] 积分呢?在这种情况下,存储双打的最佳方式是什么?感谢您的任何提示。

【问题讨论】:

  • 我会使用 struct Point { double x; double y; }vector&lt;Point&gt; points;
  • 这能回答你的问题吗? std::vector of std::vectors contiguity
  • std::array 是 C 样式数组的薄包装器。所以它存储实际的数组,而不是指向数组的指针
  • @scohe001 为什么你希望 std::array 在这方面表现得像 std::vector ?你明白两者的区别了吧?
  • “在这种情况下,存储双精度对的最佳方法是什么?” — 这可能取决于您要对它们执行的操作。在某些情况下,将它们存储为两个单独的向量(x 和 y 坐标)可能会更好。您可能还希望提供比默认对齐更强大的对齐方式,以使它们对 SIMD/缓存更友好。

标签: c++ arrays performance vector multidimensional-array


【解决方案1】:

假设sizeof(std::array&lt;double, 2&gt;)alignof(std::array&lt;double, 2&gt;) 的整数倍,那么它们应该连续存储,没有填充。

而且很可能永远都是这样。

【讨论】:

  • 对于 any 类型,sizeof(T) 不是 alignof(T) 的整数倍吗?
  • 这里不能保证一个数组会连续运行到内存中的下一个数组。
【解决方案2】:

数组向量是否连续?

不,不是。 std::array 最后可能包含填充甚至附加成员。更多细节,例如,这里:


但我相信这不太可能发生,您可以通过比较 2 * sizeof(double)sizeof(std::array&lt;double, 2&gt;) 来简单地检查这种情况。

【讨论】:

  • 但是在 Working draft 中它在 22.3.7 类模板数组 [array] 中说:The header defines a class template for storing fixed-size sequences of objects. An array is a contiguous container 和在 22.3.11 类模板向量 [vector] 中说:A vector meets all of the requirements of a container and... and, for an element type other than bool, of a contiguous container。我不确定 OP 是在询问两个连续数组中的数据是连续的还是只是 std::array 对象本身...
  • @TonyTannous 当然,单个std::array 是一个连续容器。但这并不意味着如果您将两个数组彼此相邻放置(到向量的缓冲区),那么它们的元素之间就不会有任何“间隙”。
  • 那很好,我猜 OP 是在询问 std 数组中的元素而不是对象本身,在这种情况下我同意你的看法。
  • 即使您检查大小是否相同,也不能保证它们在不同的编译器或具有相同编译器的不同架构甚至使用相同编译器的相同编译器上仍然相同要编译的不同标志。
  • @galik 是的,但这通常是可移植性和 ABI 的问题。例如,您能否在两个翻译单元中使用单个 std::array 对象,这些翻译单元使用不同的编译器或不同的标志编译然后链接在一起?一旦一个类型的内存表示在不同条件下可能有不同的大小(或内存布局),你基本上不能在库等中使用它。
猜你喜欢
  • 1970-01-01
  • 2014-09-26
  • 2018-12-20
  • 1970-01-01
  • 2011-02-19
  • 1970-01-01
  • 2022-06-15
  • 1970-01-01
  • 2010-09-19
相关资源
最近更新 更多