64位环境中的成员变量指针

时间:2009-02-24 02:29:07

标签: c++ visual-studio-2005 64-bit

我发现在尝试使用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而言,这似乎是一个相当大的错误。谷歌搜索没有任何结果(但我可能使用了错误的术语。成员变量指针?任何人都想纠正我吗?),所以我很好奇这是否只是我或更广泛的问题。

2 个答案:

答案 0 :(得分:4)

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

IIRC,在64位VS2005中,指向成员的指针可占用4或12个字节(取决于虚拟/多重继承),但IDE始终显示8个字节(其中(恕我直言)是IDE中的错误。)

答案 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也可能具有启发性,尽管它主要涉及指向成员函数的指针。