Как стать автором
Обновить

Комментарии 6

Спасибо за перевод. Картинок бы хотелось. А то текстовое описание указателей, указывающих на указывающие на методы указатели немного трудно воспринимать.

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

Гнать таких людей в шею. Хотя бы обзорное представление иметь нужно. Особенно сильно пригождается в embedded: мне приходилось анализировать стрельбу по vtable. А то будет возникать недоумение: у меня тут функция non-pure-virtual вызывается, а исключение по нулевому адресу генерируется, КАК ТАКОЕ ВОЗМОЖНО ВООБЩЕ!!!111 Ну или когда вдруг работает код, совершено не тот, который ожидается. Кроме того, просто становится понятным: почему не стоит вызывать виртуальные функции в конструкторе и деструкторе, особенно в базовых классах.


Другое дело, что не стоит полагаться на это при кодировании, завязывать логику и, тем более, какие-то хаки.

Надо бы где-нибудь разжиться спецификацией на ABI C++ и/или документацией на компиляторы, вместо того, чтобы заниматься реверс-инжинерингом "что же там гусь накомпилил".


Моего гугл-фу не хватило найти сейчас спеки на гуся/шланга/студию.
Всё, что нашёл более-менее толкового — это проект документации "Itanium C++ ABI" (там тексты разной степени древности, от 1999 до 2017)


Вот тут — сводная таблица примеров разных наследований и лэяутов таблиц.
https://itanium-cxx-abi.github.io/cxx-abi/cxx-vtable-ex.html




Или вот ещё: https://refspecs.linuxfoundation.org/cxxabi-1.86#vtable
Но там очень многабукв на английском

Нужно другое представление информации. Вывод gdb плохо читаем, как бы ни старались авторы. Картинки со стрелочками помогли бы.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий