Объяснение виртуальной таблицы

Возможный дубликат:
Понимание записей Vtable

Использование g ++ версии 4.6.3, 64-битный компьютер. Я знаю, что компилятор может свободно реализовывать виртуальные функции так, как хочет. Я хочу знать, что здесь произошло.

Мои занятия:

#include <iostream>
class test
{
public:
virtual void func(){std::cout<<"in class test";}
};

int main()
{
test obj;
obj.func();
return 0;
}

Глядя на виртуальную таблицу, сгенерированную компилятором,

Vtable for test
test::_ZTV4test: 3u entries
0     (int (*)(...))0 (<---- what is this? )
8     (int (*)(...))(& _ZTI4test)
16    (int (*)(...))test::func

По смещению 8 это RTTI

По смещению 16 это вход для виртуальной функции.

Мой вопрос: почему есть запись для NULL со смещением 0 или другими словами, какова цель первой записи?

Постскриптум Я думал, что это может быть связано с выравниванием, но затем я добавил больше виртуальных функций, но запись RTTI все еще была по смещению 8.

9

Решение

Я считаю, что первая запись или запись в 0 является смещением на верхний указатель.

Увидеть следующий важный вопрос

Просматривая остаток -fdump-class-иерархию из вашего исходного кода, большинство классов, кажется, имеют первую запись как (int (*)(...))0 единственные классы, которые не имеют его в качестве первой записи, имеют его в качестве второй и имеют первую запись в качестве смещения для родительского класса, учитывая иерархию классов C ++ STL для потоков.

В соответствующем вопросе дается мертвая ссылка на некоторые примеры из Vtable, я думаю, что доступна живая версия этой ссылки Вот

Еще один полезный ресурс, подробно описывающий структуру vtables, Вот.

8

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]