Pull to refresh

Comments 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 плохо читаем, как бы ни старались авторы. Картинки со стрелочками помогли бы.
Sign up to leave a comment.