2009-02-24 41 views
1

我发现在尝试使用luaBind风格的类绑定系统时,将指针传递给成员变量在编译为64位应用程序时似乎无法正常工作。具体做法是:在64位环境中的成员变量指针

class Foo { 
    int a; 
    int b; 
}; 

采用上述类得到&美孚:: B在32位将返回(如预期)0x00000004。 64位的相同调用返回0xCCCCCCCC00000004,这是32位的正确和32位的WTF。

我的第一个想法是,这是编译器中的错误(我在Vista 64 Business上使用Visual Studio 2005 SP1),但这似乎是一个骄傲地宣称64位兼容的IDE的相当大的错误。谷歌搜索什么都没有发生(但我可能会使用错误的术语。成员变量指针?任何人都在意纠正我?),所以我很好奇,如果这只是我或者更广泛的问题。

回答

4

尝试打印sizeof(&Foo::b)

IIRC,在64位VS2005指针构件可以占据4或12个字节(取决于虚拟/多重继承),但IDE始终显示8个字节(其中(IMHO)是在IDE的一个错误)。

+0

同意,调试器错误。 – 2009-02-24 03:28:46

2

指向成员的指针并不一定如你所期望的那么简单。考虑:

#include <iostream> 

struct Foo { 
    int a; 
}; 


struct Bar { 
    int b; 
}; 

struct Baz : public Bar, public Foo { 
    int c; 
}; 

struct Quux : public Bar { 
    int d; 
}; 

int main() { 
    Baz x; 
    x.a = 10; 
    int (Foo::*ptr) = &Foo::a; 
    using namespace std; 

    cout << x.*ptr << endl; 
    return 0; 
} 

你真的不应该“期待”指向成员的任何特定位模式。他们可能指向一个thunk,他们可能是一个抵消,谁知道。同样在64位的情况下,你确定在打印时指向成员的指针是64位吗?指向成员的指针不必与其他指针的大小相同(并且通常不是)。

article也可能是englightening,尽管它主要处理成员函数的指针。