Указатели переменных-членов в 64-битной среде - PullRequest
1 голос
/ 24 февраля 2009

Я обнаружил, пытаясь использовать систему привязки классов в стиле luaBind, что передача указателей на переменные-члены, похоже, не работает правильно при компиляции как 64-битного приложения. В частности:

class Foo {
    int a;
    int b;
};

С указанным выше классом получение & Foo :: b в 32 битах вернет (как и ожидалось) 0x00000004. Тот же самый вызов в 64 битах возвращает 0xCCCCCCCC00000004, что составляет 32 бита правильных и 32 бита WTF.

Сначала я подумал, что это ошибка в компиляторе (я использую Visual Studio 2005 SP1 в Vista 64 Business), но это кажется довольно большой ошибкой для IDE, которая с гордостью заявляет о 64-битной совместимости. Поиск в Google ничего не дает (но я могу использовать неправильный термин. Указатель переменной члена? Кто-нибудь хочет меня поправить?), Поэтому мне любопытно, это только я или более распространенная проблема.

Ответы [ 2 ]

4 голосов
/ 24 февраля 2009

Попробуйте напечатать sizeof(&Foo::b).

IIRC, в 64-битном VS2005 указатель на член может занимать 4 или 12 байтов (в зависимости от виртуального / множественного наследования), но IDE всегда отображает 8 байтов (что (IMHO) является ошибкой в ​​IDE).

2 голосов
/ 24 февраля 2009

Указатели на участников не обязательно так просты, как вы могли ожидать. Рассмотрим:

#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 битам, когда вы его печатаете? Указатели на член не обязательно должны быть того же размера, что и другие указатели (и часто это не так).

Эта статья также может быть полезной, хотя в основном она касается указателей на функции-члены.

...