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

x3naxklr  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(85)

在尝试使用luaBind-style类绑定系统时,我发现在编译为64位应用程序时,传递指向成员变量的指针似乎无法正常工作。具体来说:

class Foo {
    int a;
    int b;
};

字符串
对于上面的类,32位的getting &Foo::b将返回(如预期的那样)0x 0000004。64位的相同调用返回0xCCCCCC 0000004,这是32位的正确和32位的WTF。
我的第一个想法是这是编译器中的一个错误(我在Vista 64 Business上使用Visual Studio 2005 SP1),但对于一个自豪地声称64位兼容性的IDE来说,这似乎是一个相当大的错误。谷歌搜索没有发现任何问题(但我可能使用了错误的术语。成员变量指针?有人愿意纠正我吗?),所以我很好奇这是只是我还是一个更普遍的问题。

zzwlnbp8

zzwlnbp81#

尝试打印sizeof(&Foo::b)
IIRC,在64位VS 2005中,指向成员的指针可以占用4或12个字节(取决于虚拟/多重继承),但IDE总是显示8个字节(恕我直言,这是IDE中的一个错误)。

mccptt67

mccptt672#

指向成员的指针并不一定像你想象的那么简单。

#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位的吗?指向成员的指针不必和其他指针大小相同(通常不是)。
这个article也可能是englighting,尽管它主要处理指向成员函数的指针。

相关问题