170 похожих чатов

Здравствуйте. ❔Если класс не участвует во множественном наследовании, можно ли утверждать,

что указатель на таблицу виртуальных функций расположен по смещению 0 (а дальше идут поля)?
Если нельзя, есть ли более-менее надёжный кроссплатформенный способ прочитать vtable для объекта?

52 ответов

3 просмотра

Кроссплатформенный способ для некроссплатформенного vtable? Даже учитывая, что оно везде

0) Нельзя утверждать, что класс не участвует в множественном наследовании. Это всегда можно сделать. 1) Нет, указатель на таблицу виртуальных функций вообще не доступен приложению в явном виде. 2) Нет, способа нет.

И даже больше, на сколько я знаю: С точки зрения стандарта vtable не существует

Ilya Zviagin
0) Нельзя утверждать, что класс не участвует в мно...

Я делаю FFI, у приложения будет свой ламповый интерфейс. Позвольте, чтобы исключить проблему XY описать задачу: мне нужно вернуть указатель на нечто. Этот указатель на нечто другой (недоступный мне) кусок программы интерпретирует как Base* и потом вызывает коллбэки: onStart, onEvent и т.д. Я формирую объект Wrapper в куче, для Wrapper - я отключаю выравнивание, - первым полем у меня идёт указатель на массив функций. - дальше данные Возвращаю указатель на этот Wrapper. Я так понимаю это не совсем надёжно, можно ли надёжнее?

𝙽𝚒𝚌𝚔 𝙻𝚒𝚗𝚔𝚎𝚛
Я делаю FFI, у приложения будет свой ламповый инте...

если ваш код и недоступный вам кусок программы компилируются разными компиляторами (разными версиями одного компилятора), то стандарт не дает вам никаких гарантий, что внутренняя структура объектов Base будет одинаковой если хочется надежно, то надо сишное апи (и, соответственно, ABI) и с++ обертка над ним

𝙽𝚒𝚌𝚔 𝙻𝚒𝚗𝚔𝚎𝚛
Я делаю FFI, у приложения будет свой ламповый инте...

А почему бы не вернуть указатель на произвольного наследника Base?

𝙽𝚒𝚌𝚔 𝙻𝚒𝚗𝚔𝚎𝚛
Я делаю FFI, у приложения будет свой ламповый инте...

Составлять руками vtable в С, чтобы в дальнейшем пользоваться ею как "настоящей" из С++? Тут грабли на каждом шагу, даже в случае конкретной реализации

Egor Suvorov
А почему бы не вернуть указатель на произвольного ...

Я не в C++, я можно сказать в C (на самом деле в Rust, но не суть).

Vlad
если ваш код и недоступный вам кусок программы ком...

Понятно, то есть правильный способ: сделать прослойку на C++ с набором extern C функций.

Liber Azerate
Если что, есть расточатик

Кто мне подскажет лучше лейаут C++ объектов, если не эксперты по языку. В расточатике обычно с лайфтаймами воюют :-P

𝙽𝚒𝚌𝚔 𝙻𝚒𝚗𝚔𝚎𝚛
Я делаю FFI, у приложения будет свой ламповый инте...

Можно, не отключай выравнивание, не делай pack, не отсвечивай указатель на таблицу виртуальных функций. Не делай никаких предположений о размещении членов класса (и функций) в памяти, делай это всё в явном виде.

Vlad
если ваш код и недоступный вам кусок программы ком...

Сшное апи тут не поможет и не помешает... Оно тут ни при чём.

Ilya Zviagin
Сшное апи тут не поможет и не помешает... Оно тут ...

у него объекты будут ходить между библиотекой и клиентским кодом. ABI ни при чем, конечно

Ilya Zviagin
Можно, не отключай выравнивание, не делай pack, не...

Не отключать выравнивание? 32/64 бита не выстрелят в ногу в этом случае? А ещё что значит "не отсвечивай указатель на таблицу"?

Liber Azerate
Но есть standard layout :)

но удовлетворяет ли ему Base

𝙽𝚒𝚌𝚔 𝙻𝚒𝚗𝚔𝚎𝚛
Не отключать выравнивание? 32/64 бита не выстрелят...

Зачем тебе адреса членов, (смещения) , адрес( смещение) указателя на таблицу виртуальных методов?

Anatoly Shirokov
но удовлетворяет ли ему Base

Если мы говорим о виртуальности, то нет. Но сишное апи как раз гарантирует

Ilya Zviagin
Зачем тебе адреса членов, (смещения) , адрес( смещ...

Чтобы сформировать в точности объект, который вызывающий код на С++ будет использовать прозрачно, как будто это нативный наследник Base. Но вообще по обсуждению выше я уже понял, что это плохая затея, лучше смаппить все методы Base в портянку extern C функций Base_onStart, Base_onEvent и так далее. Тогда мне неважно, по какому смещению vtable, но к сожалению это требует копипасты и возни с параметрами, плюс подтягивания C++ компилятора для моего кода. Но вроде должно получиться...

𝙽𝚒𝚌𝚔 𝙻𝚒𝚗𝚔𝚎𝚛
Чтобы сформировать в точности объект, который вызы...

но вы же на стороне клиента потом обернете эти функции в нормальный класс, который изначально хотели?

Vlad
но вы же на стороне клиента потом обернете эти фун...

Да, конечно, нужно предоставить удобный апи.

𝙽𝚒𝚌𝚔 𝙻𝚒𝚗𝚔𝚎𝚛
Чтобы сформировать в точности объект, который вызы...

Вообще, не обязательно даже по адресу vtable будет находиться начало vtable

Liber Azerate
Вообще, не обязательно даже по адресу vtable будет...

Я вот эту статью читал, https://shaharmike.com/cpp/vtable-part1/ Там правда автор только clang использует, поэтому его выводы ограничены.

𝙽𝚒𝚌𝚔 𝙻𝚒𝚗𝚔𝚎𝚛
Я вот эту статью читал, https://shaharmike.com/cpp...

Ну тут бы стоило читать конкретный ABI: https://itanium-cxx-abi.github.io/cxx-abi/abi.html#vtable

Liber Azerate
Ну тут бы стоило читать конкретный ABI: https://it...

Пожалуй. Но я пошёл другим путём уже 😊 зы, спасибо за ссылку

𝙽𝚒𝚌𝚔 𝙻𝚒𝚗𝚔𝚎𝚛
Я делаю FFI, у приложения будет свой ламповый инте...

Еще могу добавить что порядок функций в vtable может отличаться в разных компиляторах. Если я ничего не напутал я видел такое не совпадение между msvc и mingw. Опять же, если мне не изменяет память был флажок для mingw заставляющий использовать порядок принятый на винде, но это еще одна причина не закладываться на vtable.

magras
Еще могу добавить что порядок функций в vtable мож...

Любопытное наблюдение. В принципе, если было бы только два варианта размещения, то я бы согласился на #ifdef :-) Но товарищи выше подсказывали, что может быть много...

Vlad
если ваш код и недоступный вам кусок программы ком...

Ну если это msvc, то там abi полиморфных интерфейсов стабилен, на этом весь COM держится, думаю в других компиляторах так же

Kirill Bolshakov
Ну если это msvc, то там abi полиморфных интерфейс...

очень похоже на правду, но мне недостает квалификации и опыта быстро расписать, как готовить плюсовое ABI и какие там грабли, хотя бы основные, поэтому предложил технически более простое решение, каким оно мне видится если вы так можете, я сам с удовольствием почитаю

Alexander Karaev
Составлять руками vtable в С, чтобы в дальнейшем п...

Вопрос чуток в сторону. Оптимезирую вот такую конструкцию unordert_map< string_view, function<void() >> . 1) если хорошие альтернативы 2) может по женить с корутинами?

Aleksandr Borgardt
Вопрос чуток в сторону. Оптимезирую вот такую конс...

А что оптимизируешь, это же структура данных...

Aleksandr Borgardt
Вопрос чуток в сторону. Оптимезирую вот такую конс...

а ты осознанно выбрал string_view для использования в качестве ключа в unordered_map? это же прямой путь в загробный мир.

Anatoly Shirokov
а ты осознанно выбрал string_view для использовани...

А вдруг там определенные в compile time литералы?

Dmitriy [Отпуск]
А вдруг там определенные в compile time литералы?

а вдруг... - это несколько не из нашей реальности

Max Kolesnikov
Тогда const char* очевидно

Гарантий одинаковости указателей на которые при одинаковости самих литералов стандартом не предусмотрено?

Max Kolesnikov
Тогда const char* очевидно

Совершенно неочевидно

Max Kolesnikov
Тогда const char* очевидно

Ой как неочевидно. std::hash для const char* нет - получите сравнение указателей со всеми вытекающими

Denis P
это оптимизация компилятора

Которая, при отключении, например, приведет к некорректному поведению потенциально?

Aleksandr Borgardt
Все так

все не так, любой член твоей команды может положить туда все что угодно, в том числе ссылку на протухший std::string

Aleksandr Borgardt
Вопрос чуток в сторону. Оптимезирую вот такую конс...

и вопрос номер 2: причем здесь корутины? или это в каком-то другом контексте?

Aleksandr Borgardt
Все так

Вроде были реализации umap со строго constexpr ключами

Anatoly Shirokov
и вопрос номер 2: причем здесь корутины? или это в...

Хочу заменить function на корутину или дать такую возможность

Aleksandr Borgardt
Хочу заменить function на корутину или дать такую ...

И вот мы вернулись к пропозалу экзекютеров... =) А точнее к тому что некоторые абстракции из него все-таки нужны.

Похожие вопросы

Обсуждают сегодня

Комрады, посоветуйте, куда копать? Стал прикручивать кастомизацию тем. В OnShow главной главной формы пытаюсь загрузить из файла настроек и применить тему (на скрине, как долж...
Ed Doc
13
OnShow один раз вызывается? или возможен Hide?
Iluha Companets
14
Такс, блин, таки кто-то знает, каким образом работают макросы stdin/stdout/stderr? Я влез в stdio.h, там определения нет, отладил через асмокод - вызывается функция со странны...
The Bird of Hermes
18
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
Всем привет, на линуксе лучше на fasm или nasm учиться писать для начала ?
meszjol
14
Если у меня есть такой класс: Object = {} function Object:new(a_name, a_transform, a_color, a_mesh, a_material, a_shader, a_textures) local private = {} private.n...
Cuarno Vile
4
@sand_witch скорее к тебе вопрос, добавил в .cabal webdriver-w3c и вот такая ошибка от nix develop error: Package ‘script-monad-0.0.4’ in /nix/store/7vdxbra0kwbr0ys0kc5...
Fedor
5
Гайз, кто-нибудь пробовал запустить probe-rs под камень, которого нет в probe-rs? Мб есть какой-нибудь пример у кого... Через target-gen попробовал сгенерировать chip-descript...
Максим Смирнов
2
А еще в перле можно уже @arr1 + @arr2?
Sergei Zhmylove
53
@MrMiscipitlick А можешь макрос написать, который будет вычислять смещение относительно переданных меток? Просто .label1-.label2, и вернуть значение.
КТ315
35
Карта сайта