c++ - C++ 结构 vector 的内存布局

标签 c++ memory vector struct

假设我有一个结构

struct Point
{
    int x;
    int y;
    int z;
};
Point p = {1,2,3};

我知道在内存中它是连续组织的

p = | 1 | 2 | 3 |

如果我有 Point 结构的 std::vectordata() 函数是否也连续返回数组?或者是否还添加了额外的“东西”?例如

Point p1 = {1,2,3};
Point p2 = {4,5,6};
Point p3 = {7,8,9};
std::vector<Point> points;
points.push_back(p1);
points.push_back(p2);
points.push_back(p3);

调用points.data()会返回指向数组的指针,如下所示:

| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8| 9 |
 ^ptr

此外,如果结构稍微复杂一点,包含一个 vector ,比如说

MultiDimPoint
{
    std::vector<int> values;
}

这些 MultiDimPoint vector 也会是连续的吗?也就是说,会

MultiDimPoint mdp1;
mdp1.values = std::vector<int>(0,1,2,3);

MultiDimPoint mdp2;
mdp2.values = std::vector<int>(4,5,6,7,8,9);

std::vector<MultiDimPoint> mdp_vec;
mdp_vec.pushback(mdp1);
mdp_vec.pushback(mdp2);

给予

| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8| 9 |
 ^ptr

什么时候调用mdp_vec.data()

最佳答案

C++ 标准将其留给每个 C++ 实现来定义和使用特定实现所需的结构的任何填充。

出于硬件驱动对齐的目的,您的 C++ 编译器可能会向此结构添加一些填充,这会导致 vector 中此struct 的实例之间出现一些“间隙”。

话虽如此,对于仅包含普通 int 的类,您不太可能在现代 C++ 实现中遇到这种填充。您可以通过观察此structsizeof 与单个sizeof 的大小来确定您的C++ 实现是否属于这种情况。 int

但是,如果您的目标是编写可在任何 C++ 实现上正常工作的可移植代码,则不应做出任何类型的假设。

现在,当你有一个 vector 作为另一个类的成员,以及这些类的 vector 时,每个类成员中的每个 vector 彼此完全独立,并且你不能保证连续类成员中的 vector 将结束up 位于一个连续的内存块中。事实上,您几乎可以保证他们不会。

关于c++ - C++ 结构 vector 的内存布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44187485/

相关文章:

c++ - 使用 C++(和 GSL)扩展和嵌入 Python(和 NumPy): pass gsl_matrix to python and back

c++ - 将现有内存映射到 Matlab mxArray 而不会浪费内存

c++ - 在 Stack 上声明大数组

node.js - 限制 node.js 的内存使用

c++ - 使用 map 代替 vector

c++ - 匹配开始/结束分析调用

c++ - 安装 CMake 后,我找不到带有 `find_package` 的包

c++ - 如何从核心文件中获取有关崩溃的信息?

c++ - 将 Char 数组转换为 uint8_t vector

c++ - 我究竟如何使用函数 push_back 和 pop_back()?我在下面的链接中查找了它们,但仍然不明白