结构内向量元素的数据字节偏移量

Data byte offset of elements of a vector inside a struct

如果我有一个 struct 成员 int a, b, c;,我可以使用 offsetof(structName, member).

获取每个成员的字节偏移量

现在,如果我有一个 struct 和一个 vector<int> { a, b, c },我可以使用 offsetof(structName, vectorName) 获得 vector 的偏移量。

知道了,就是这个操作:

offsetof(structName, vectorName) + sizeof(vector<int>) + sizeof(int)*2

获取 b 偏移量的有效方法?

首先,bvector 的第二个元素,但 sizeof(int)*2 将 return 改为第三个元素的偏移量。

但更重要的是,vector 的元素数组不存储在 vector class 本身内部,因此使用相对于 vector 本身的偏移量不会工作。实际数组存储在内存中的其他地方,然后 vector 包含一个内部成员,它是指向数组的 指针

因此,确定 vector 数组中元素的偏移量真正需要的是 sizeof(vector::value_type) * index(其中 index 对于 b 是 1在你的例子中)。但是,要使用该偏移量实际访问元素,您首先需要指向数组本身的指针。您可以使用 vectordata() 方法或 operator[] 来获取该指针,例如:

structName *s = ...;
vector<int> *v = reinterpret_cast<vector<int>*>(
    reinterpret_cast<unsigned char*>(s)
    + offsetof(structName, vectorName)
);
int *arr = v->data();
// or: int *arr = &(*v)[0];
size_t offset = sizeof(int) * index;
int *element = reinterpret_cast<int*>(
    reinterpret_cast<unsigned char*>(arr)
    + offset
);
// use element as needed...

但是,您真的不应该这样使用 offsetof。以上可以大大简化为:

structName *s = ...;
int *element = s->vectorName.data() + index;
// or: int *element = &(s->vectorName[index]);
// use element as needed...