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

问题描述 投票:0回答:2

我在尝试使用 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 来说似乎是一个相当大的错误。谷歌搜索什么也没找到(但我可能使用了错误的术语。成员变量指针?有人愿意纠正我吗?),所以我很好奇这是否只是我的问题还是一个更广泛的问题。

c++ visual-studio-2005 64-bit
2个回答
4
投票

尝试打印

sizeof(&Foo::b)

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


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;
}

您确实不应该“期望”指向成员的指针中存在任何特定的位模式。他们可能指向一个重击,他们可能是一个偏移量,谁知道呢。同样在64位的情况下,你确定打印时指向成员的指针是64位的吗?指向成员的指针不必与其他指针具有相同的大小(而且通常不是)。

这篇文章也可能很有启发性,尽管它主要处理指向成员函数的指针。

© www.soinside.com 2019 - 2024. All rights reserved.