结构内向量元素的数据字节偏移量
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
偏移量的有效方法?
首先,b
是 vector
的第二个元素,但 sizeof(int)*2
将 return 改为第三个元素的偏移量。
但更重要的是,vector
的元素数组不存储在 vector
class 本身内部,因此使用相对于 vector
本身的偏移量不会工作。实际数组存储在内存中的其他地方,然后 vector
包含一个内部成员,它是指向数组的 指针 。
因此,确定 vector
数组中元素的偏移量真正需要的是 sizeof(vector::value_type) * index
(其中 index
对于 b
是 1在你的例子中)。但是,要使用该偏移量实际访问元素,您首先需要指向数组本身的指针。您可以使用 vector
的 data()
方法或 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...
如果我有一个 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
偏移量的有效方法?
首先,b
是 vector
的第二个元素,但 sizeof(int)*2
将 return 改为第三个元素的偏移量。
但更重要的是,vector
的元素数组不存储在 vector
class 本身内部,因此使用相对于 vector
本身的偏移量不会工作。实际数组存储在内存中的其他地方,然后 vector
包含一个内部成员,它是指向数组的 指针 。
因此,确定 vector
数组中元素的偏移量真正需要的是 sizeof(vector::value_type) * index
(其中 index
对于 b
是 1在你的例子中)。但是,要使用该偏移量实际访问元素,您首先需要指向数组本身的指针。您可以使用 vector
的 data()
方法或 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...