类成员在数组中的距离(以字节为单位)

c++: How distant(in bytes) are class member in an array?

本文关键字:字节 为单位 距离 成员 数组      更新时间:2023-10-16

我没有找到更好的方法来表达我的问题,像这样:下面的输出总是为真吗?这是便携式的吗?

struct Point
{
    int x;
    int y;
};
//...
std::vector<Point> points(3);
unsigned char* start = (unsigned char*)(&points[0]);
unsigned char* end = (unsigned char*)(&points[1]); 
std::cout << "is this the same ? " << std::distance(start,end) == sizeof(Point);

如果将points定义为原始数组而不是vector会怎样?输出仍然总是为真吗?

Point *points = new Point[3]; // instead of std::vector<Point> points(3);

对于std::vector,概览]/1 (N3337)说:

一个向量的元素是连续存储的,这意味着如果vvector<T, Allocator>,而T不是bool,那么对于所有0 <= n < v.size(),它都遵循&v[n] == &v[0] + n的标识。

所以,是的,你的程序的行为是可移植的和定义良好的。

对于数组,[dcl。数组)/1:

数组类型的对象包含一个连续分配的N类型的T子对象的非空集合。

这并不像vector引号那样明确,但是"连续"一词的共同使用表明,std::vector存储标识也适用于数组。

是的,vector的一个要求是其元素必须连续存储。

从n2798:

23.2.6类模板vector [vector]

1 vector是支持随机访问的序列容器迭代器。此外,它支持(平摊)常数时间插入最后进行擦除操作;插入和删除在中间采取线性时间。存储管理通过提示自动处理可以给予提高效率。向量的元素是连续存储,意思是如果v是一个向量,其中T是输入bool以外的类型,则遵循标识符&v[n] == &v[0] + n对于所有0 <= n 相关文章: