我在尝试使用 luaBind 风格的类绑定系统时发现,在编译为 64 位应用程序时,将指针传递给成员变量似乎无法正常工作。具体来说:
class Foo {
int a;
int b;
};
使用上述类获取 32 位的 &Foo::b 将返回(如预期)0x00000004。 64 位中的相同调用返回 0xCCCCCCCC00000004,这是正确的 32 位和 WTF 的 32 位。
我的第一个想法是,这是编译器中的一个错误(我在 Vista 64 Business 上使用 Visual Studio 2005 SP1),但这对于一个自豪地声称 64 位兼容性的 IDE 来说似乎是一个相当大的错误。谷歌搜索什么也没找到(但我可能使用了错误的术语。成员变量指针?有人愿意纠正我吗?),所以我很好奇这是否只是我的问题还是一个更广泛的问题。
尝试打印
sizeof(&Foo::b)
。
IIRC,在 64 位 VS2005 中,指向成员的指针可能占用 4 或 12 个字节(取决于虚拟/多重继承),但 IDE 始终显示 8 个字节((恕我直言)这是 IDE 中的一个错误)。
指向成员的指针并不一定像您想象的那么简单。考虑:
#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;
}
您确实不应该“期望”指向成员的指针中存在任何特定的位模式。他们可能指向一个重击,他们可能是一个偏移量,谁知道呢。同样在64位的情况下,你确定打印时指向成员的指针是64位的吗?指向成员的指针不必与其他指针具有相同的大小(而且通常不是)。
这篇文章也可能很有启发性,尽管它主要处理指向成员函数的指针。