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它是實現相關的。它的位置可能會改變程序的輸出。
那麼你能否總是預測這個程序的輸出而不指定目標平臺?