一个数组向量是连续的吗?

4

如果我创建

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

我知道points2是一个在堆上持有double的连续内存块。我认为points是一个指向堆栈上double*的连续内存块?但是,这些数组在堆栈中是连续的吗?假设我正在存储双精度浮点数对来表示某些点。 points2在内存中是这样的:[x0 y0 x1 y1 x2 y2 ...] 那么points呢?在这种情况下,最好的方法是如何存储双精度浮点数对?感谢任何提示。

4
我会使用struct Point { double x; double y; }和vector<Point> points;。 - Eljay
这个回答解决了你的问题吗?std::vector of std::vectors contiguity - scohe001
3
std::array 是一个围绕 C 风格数组的轻量级封装,因此它存储实际的数组而不是数组指针。 - UnholySheep
6
@scohe001,为什么您期望std::array在这方面的行为像std::vector呢?您理解这两者之间的区别,对吗? - Sneftel
2
“在这种情况下,存储一对双精度浮点数的最佳方法是什么?” — 这取决于您想要执行的操作。在某些情况下,将它们存储为两个单独的向量(x 和 y 坐标)甚至可能更好。您还可以提供比默认对齐更强的对齐方式,以使它们更适合 SIMD/缓存。” - Daniel Langr
显示剩余6条评论
2个回答

2

但在工作草案中,第22.3.7节类模板数组[array]中写道:“头文件定义了一个类模板,用于存储固定大小的对象序列。数组是一个连续的容器”,而在第22.3.11节类模板向量[vector]中写道:“向量满足所有容器的要求...并且对于除bool以外的元素类型,它是一个连续的容器”。我不确定OP是否在询问两个连续数组中的数据是否连续,还是仅仅是std::array对象本身是否连续... - Tony
2
@TonyTannous 当然,单个std::array是一个连续的容器。但这并不意味着如果你把两个数组放在一起(放到向量的缓冲区),它们之间就不会有任何“间隙”了。 - Daniel Langr
那就好,我猜OP是在问std数组中的元素而不是对象本身,在这种情况下,我同意你的看法。 - Tony
@lucmobz 这个问题非常相关:https://dev59.com/dFQJ5IYBdhLWcg3wSTt1。 - Daniel Langr
@lucmobz 这是一个常见的误解。数组不是指针,只是有时候表现得像指针。此外,这仅适用于 C 数组。std::array 是一个结构体 (struct):http://eel.is/c++draft/array.overview#5。 - Daniel Langr
显示剩余5条评论

-1
假设sizeof(std::array<double, 2>)alignof(std::array<double, 2>)的整数倍,那么它们应该被连续存储而没有填充。
而且这很有可能总是成立。

对于 任何 类型,sizeof(T) 不是 alignof(T) 的整数倍吗? - Sneftel
这里并不能保证一个数组在内存中会连续地运行到下一个数组。 - Galik
@Sneftel:是的:https://dev59.com/JLHma4cB1Zd3GeqPK2i5 - mrks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接