gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 00:54:46 25 4
gpt4 key购买 nike

假设我有一个结构

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;
}

这些 MultiDimPointvector 是否也是连续的?也就是说,会

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com