c++ - C++ 中的 vector 存储

标签 c++ memory stdvector

我希望存储一个大的 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/

相关文章:

c++ - 为什么这个 std::vector::emplace_back 失败?

c++ - 我可以从 uint8_t(或 std::byte)范围初始化 std::vector<bool> 以便输入中的每一位都被视为 bool 值吗?

c++ - 如何抛出好的异常?

c++ - 为什么将 const 对象传递给需要非常量模板类型参数的模板化函数会导致编译错误?

java - 如何缩小java堆空间?

c++ - 将 vector 的 vector 转换为指针的指针

.net - c++ fatal error c1083项目以前很好,现在怎么办?

c++ - boost 单元测试异常检查异常失败

.net - WinForm中如何清除用户控件的内存?

C : Valgrind telling "Invalid write of size 4" but can't locate the problem