我希望存储一个大的 d 维点 vector (d 固定且小:<10)。
如果我定义一个 Point
作为 vector<int>
, 我认为是 vector<Point>
将在每个位置存储一个指向 Point 的指针。
但是如果定义一个 Point
作为固定大小的对象,例如:
std::tuple<int,int,...,int>
或 std::array<int, d>
,
程序会将所有点存储在连续内存中还是会保留额外的间接级别?
如果答案是数组避免了额外的间接性,这是否会对扫描 vector<Point>
时的性能(缓存利用局部性)产生很大影响? ?
最佳答案
如果您定义 Point
具有连续的数据存储(例如 struct Point { int a; int b; int c; }
或使用 std::array
),然后 std::vector<Point>
将存储 Point
s 在连续的内存位置,所以你的内存布局将是:
p0.a, p0.b, p0.c, p1.a, p1.b, p1.c, ..., p(N-1).a, p(N-1).b, p(N-1).c
另一方面,如果您定义 Point
作为 vector<int>
,然后是 vector<Point>
布局为 vector<vector<int>>
,不连续,如vector
将指针存储到动态分配的内存。所以你有 single Point
的连续性s,但不适用于整个结构。
第一个解决方案比第二个更有效(因为现代 CPU 喜欢访问连续的内存位置)。
关于c++ - C++ 中的 vector 存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40302857/