假设我有一个结构
struct Point
{
int x;
int y;
int z;
};
Point p = {1,2,3};
我知道在内存中它是连续组织的
p = | 1 | 2 | 3 |
如果我有 Point
结构的 std::vector
,data()
函数是否也连续返回数组?或者是否还添加了额外的“东西”?例如
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++ 实现中遇到这种填充。您可以通过观察此struct
的sizeof
与单个sizeof
的大小来确定您的C++ 实现是否属于这种情况。 int
。
但是,如果您的目标是编写可在任何 C++ 实现上正常工作的可移植代码,则不应做出任何类型的假设。
现在,当你有一个 vector 作为另一个类的成员,以及这些类的 vector 时,每个类成员中的每个 vector 彼此完全独立,并且你不能保证连续类成员中的 vector 将结束up 位于一个连续的内存块中。事实上,您几乎可以保证他们不会。
关于c++ - C++ 结构 vector 的内存布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44187485/