我发现在尝试使用luaBind风格的类绑定系统时,将指针传递给成员变量似乎在编译为64位应用程序时无法正常工作。具体做法是:
class Foo {
int a;
int b;
};
使用上面的类获得32位的& Foo :: b将返回(如预期的那样)0x00000004。 64位中的相同调用返回0xCCCCCCCC00000004,即32位正确和32位WTF。
我的第一个想法是,这是编译器中的一个错误(我在Vista 64 Business上使用Visual Studio 2005 SP1),但对于自豪地宣称64位兼容性的IDE而言,这似乎是一个相当大的错误。谷歌搜索没有任何结果(但我可能使用了错误的术语。成员变量指针?任何人都想纠正我吗?),所以我很好奇这是否只是我或更广泛的问题。
答案 0 :(得分:4)
尝试打印sizeof(&Foo::b)
。
答案 1 :(得分: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也可能具有启发性,尽管它主要涉及指向成员函数的指针。