也就是说,编译器用来生成类的标准是什么?例如,假设我有一个C
包含成员x
、y
和的类z
,并且我想知道z
该类中的偏移量。我可以像结构一样将其他成员的数据类型大小相加吗?
问问题
2563 次
7 回答
4
您可以在类的方法中以编程方式执行此操作。不通用但有效。
offset = (unsigned char*)&(this->z) - (unsigned char*)this;
完整的工作示例
#include <iostream>
class C
{
public:
int x;
char y;
int z;
size_t offset() const
{
return (unsigned char*)&(this->z) - (unsigned char*)this;
}
};
int main()
{
C c;
std::cerr << "Offset(cast): " << c.offset() << "\n";
}
于 2011-07-13T16:55:30.583 回答
2
您可以通过使用示例对象计算偏移量来做到这一点。(见@bert-jan 或@sodved 的回答)。
然而,这很危险! 您不能将 c++ 类和结构视为您想象的常规结构。
问题是,对于任何给定的指向对象的指针,偏移量可能不同!
为什么?由于子类化和多重继承,附加数据可能会放在类中常规结构成员之前。数据量可能因类的每个不同子类而异。
看到这个问题:为什么不能在 C++ 中的非 POD 结构上使用 offsetof?更多细节。
于 2011-07-13T16:57:02.473 回答
1
你可以&(class_name::member_name)
用来获得抵消。
于 2012-11-17T09:50:10.297 回答
0
你试过offsetof()吗?
http://www.cplusplus.com/reference/clibrary/cstddef/offsetof/
于 2011-07-13T16:43:39.140 回答
0
绝对不符合标准。不过,有一些编译器特定的解决方案可以帮助您推断它。
微软有这个:
#pragma pack(push,1)
struct Foo {
uint8 a;
uint32 b;
};
#pragma pack(pop)
我可以转达(仅通过传闻)GCC 也通过扩展支持此功能。
于 2011-07-13T17:12:48.183 回答
-1
#define _OFFSET(p_type, p_member) (size_t)(&((p_type *)NULL)->p_member)
struct a
{
int a, b;
};
cout << _OFFSET(struct a, b); // output is your offset
于 2011-07-13T16:48:12.493 回答