我希望存储一个大的 d 维点向量(d 固定且小:
如果我定义一个Point
as vector<int>
,我认为一个vector<Point>
将在每个位置存储一个指向 Point 的指针。
但如果定义一个Point
作为固定大小的对象,例如:std::tuple<int,int,...,int>
or std::array<int, d>
,
程序会将所有点存储在连续内存中还是保留额外的间接级别?
如果答案是数组避免了额外的间接寻址,这可能会对扫描时的性能(缓存利用局部性)产生很大影响vector<Point>
?
如果你定义你的Point
具有连续的数据存储(例如struct Point { int a; int b; int c; }
或使用std::array
), then std::vector<Point>
将存储Point
位于连续的内存位置,因此您的内存布局将是:
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
as a vector<int>
,那么一个vector<Point>
布局为vector<vector<int>>
,即not连续的,如vector
stores pointers动态分配的内存。所以你有连续性single Point
s,但不是整个结构。
第一个解决方案比第二个解决方案更高效(因为现代 CPU 喜欢访问连续的内存位置)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)