class C
{
public:
C() : m_x(0) { }
virtual ~C() { }
public:
static ptrdiff_t member_offset(const C &c)
{
const char *p = reinterpret_cast<const char*>(&c);
const char *q = reinterpret_cast<const char*>(&c.m_x);
return q - p;
}
private:
int m_x;
};
int main(void)
{
C c;
std::cout << ((C::member_offset(c) == 0) ? 0 : 1);
std::cout << std::endl;
std::system("pause");
return 0;
}
以上程序输出1
。它所做的只是检查c
对象的地址和c
的字段m_x
。它打印出1
这意味着地址不相等。我的猜测是,这是因为编译器是虚拟的,所以编译器必须为该类创建一个vtable
并将vpointer
放入该类的对象中。如果我已经错了,请纠正我。vpointer在对象中的位置
显然,它将vpointer
放在对象的开头,将m_x
字段推得更远,从而给它一个不同的地址。是这样吗?如果标准指定了vpointer
在对象中的位置?根据wiki它是实现相关的。它的位置可能会改变程序的输出。
那么你能否总是预测这个程序的输出而不指定目标平台?