【发布时间】:2017-03-11 05:09:39
【问题描述】:
我希望存储一个大的 d 维点向量(d 固定和小:
如果我将Point 定义为vector<int>,我认为vector<Point> 将在每个位置存储一个指向Point 的指针。
但是如果将Point 定义为固定大小的对象,例如:
std::tuple<int,int,...,int> 或 std::array<int, d>,
程序会将所有点存储在连续内存中还是会保留额外的间接级别?
如果答案是数组避免了额外的间接性,这是否会对扫描 vector<Point> 时的性能(缓存利用局部性)产生很大影响?
【问题讨论】:
-
标准向量类应该在很大程度上与数组兼容,这意味着它分配的数据存储在连续的内存块中,就像数组一样。如果您有一个
std::vector<Point>,那么所有Point对象都将连续存储。如果Point类本身有指针(直接或间接(比如当它有一个向量时)),那么并非所有数据都会连续存储。 -
是的,我会走元组路线或更好,只需使用普通的 C 风格结构(我仍然觉得元组使用起来很烦人,即 std::get
() 并不是全部直观)。