Как определить количество указателей VMT

Используя компилятор Visual C++, каждый объект класса имеет VMT (первый указатель в объекте), который является указателем на массив указателей на каждый метод в классе. Используя код как это:

TestObject * object = new TestObject();
void** VMT = (void**)object;
int TestCount = 100;

for( int i = 0; i < TestCount; i ++ )
{
     printf("%d function: %p\r\n", (i+1), VMT[i] );
}

Этот код перечисляет первые 100 функций в классе, но как я могу определить, сколько у этих указателей классов, учитывая, что у меня нет определения класса? Как это узнать динамически?

Спасибо!

1 ответ

Решение

Просто не делай этого.

Во-первых, у класса, который не имеет виртуальных членов, нет V-таблицы, поэтому ваша попытка получить ее в лучшем случае даст неверный указатель, а в худшем случае произойдет сбой.

Во-вторых, даже если вы его получите, вы найдете в нем только указатели на виртуальные функции-члены, обычные функции не помещаются в V-таблицу.

В-третьих, хотя я отмечаю, что вы используете MSVC, поэтому переносимость не является проблемой, это ужасно непереносимо. Я вспоминаю очень интересную объектно-ориентированную систему, которую я использовал для одной игры, которую я написал, опубликованной в Sega Genesis. Все это было сделано на ассемблере 68K, примерно в 1995 году, включая V-стол. Из-за интересных ограничений памяти все V-таблицы находились в нескольких милях от экземпляров своего класса в специальной области первой 64-килобайтной страницы памяти. У нас была какая-то хитрая хитрость компоновщика, чтобы все соединить и заставить все это работать.

Я хочу сказать, что ваша строка кода, чтобы пойти и получить VMT, может вообще не указывать на V-таблицу. Работа этого зависит от реализации, автор компилятора может делать это любым способом, каким хочет, если конечный продукт работает правильно в соответствии со стандартом.

И последний вопрос? Зачем? Какую проблему вы пытаетесь решить, которая требует таких раскопок в местах, где большинство программистов остаются в стороне.

Другие вопросы по тегам