Недавно я читал статью в блоге bitsquid о том, как управлять памятью, и автор начал рассказывать о vtable и о том, как компилятор добавляет в класс указатель. Вот ссылка на статью. Так как я почти ничего не знал о vtalbe, я начал искать объяснение в сети. Я наткнулся на эту ссылку. Основываясь на том, что я прочитал, я сделал следующий код:
char cache[24];
printf("Size of int = %d\n", sizeof(int));
printf("Size of A = %d\n", sizeof(A));
A* a = new(cache)A(0,0);
printf("%s\n",cache);
printf("vTable : %d\n",*((int*)cache));
printf("cache addr: %d\n",&cache);
int* funcPointer = (int*)(*((int*)cache));
printf("A::sayHello: %d\n",&A::sayHello);
printf("funcPointer: %d\n",*funcPointer);
A
— это класс с двумя целыми членами и виртуальной функцией sayHello()
.
EDIT: Вот определение класса:
class A {
public:
int _x;
int _y;
public:
A(int x, int y) : _x(x), _y(y){ }
virtual void sayHello() { printf("Hello You!"); }
};
В основном то, что я пытался сделать, это посмотреть, будет ли указатель внутри vtable указывать на то же место, где находится адрес, который я получаю от &A::sayHello
, но дело в том, что когда я запускаю программу, адрес внутри указателя в vtable и адрес sayHello()
всегда отличается от 295
. Кто-нибудь знает, почему это может происходить? Есть ли какой-то заголовок, который я пропустил? Я запускаю Visual Studio Express 2008 на 64-битной машине.
Из того, что я отладил, адрес, возвращаемый *funcPointer
, является истинным адресом функции sayHello()
. Но почему &A::sayHello()
возвращает другой адрес?
A
? - person Mysticial   schedule 03.04.2012A
(и компилятора/архитектуры) мало что можно сказать. - person David Rodríguez - dribeas   schedule 03.04.2012