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

Добрый день. Вопрос немного упоротый, мне что-то в голову пришла

идея касательно реализации виртуальных полей в Си. Наверное, кто-то этой бредовой вещью занимался, вопрос чисто интереса ради. Я подумал, что по сути, когда выполняются виртуальные методы в плюсах, то передают значения по ссылке и происходит адресация на нужные поля. Вот я подобное и решил затестировать на С и накатал вот такой вот код и он работает.
https://pastebin.com/5mw5QawU
Правильно ли я понимаю, что это дело будет работать только в том случае, если не поплыло выравнивание и подобные "виртуальные" поля расположены в строгом порядке во всех подобных структурах и вообще это дело черевато UB. И вообще, такие манёвры хоть где-то используются?

3 ответов

5 просмотров

ну тут поля структур полностью идентичны, а дальше ты что с этим собираешься делать? Такие манёвры если и используют где-то, то редко и по особой надобности. И лучше такое не использовать никогда. Проблема в приведении типа адреса структуры (указатель на одну структуру приводится к указателю на совсем другую структуру), это в 95% случаев не работает.

jon-pedro Автор вопроса
Ilya Zviagin
ну тут поля структур полностью идентичны, а дальше...

Но, как я понимаю, если структуры совсем индетичны по полям, то должно работать в 100% случаев, кмк. Но вообще, я примерно и предполагал, что хрень какая-то это, хотел уточнить. Просто я слышал, что есть любители писать на С в ООП стиле, и тут подумал, вдруг кто-то подобные конструкции использует для реализации виртуальных методов и т.д. не смотря на то, что смотрится не особо надёжно

ЕМНИП можно кастовать указатель на структуру к типу указателя на её первое поле. Каст должен производиться руками. Тем не менее, strict aliasing rules говорят, что имея два указателя на структуры с разными тэгами, они не могут вести на одну и ту же память.

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

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

что насчет пагинга? на осдеве непонятно(
Vi Chapmann 🪙
26
А как старый хаскел с новым стыковать ? потому как тут работает https://play.haskell.org/saved/C3xpMzcd, а вот тут https://stepik.org/lesson/7602/step/9?unit=1473 нет ошибка C...
Fedor
131
Вопрос я правильно понимаю что в коде newtype ArrowMap k v = ArrowMap { getArrowMap :: k -> Maybe v } getArrowMap есть функция типа k -> Maybe v, если да, то не понимаю задач...
Fedor
64
Ребят, что лучше для реверса: гидра или ида?
En Vind Av Sorg
26
Делаю велосипед логгер. К сообщению хочу прикрутить некоторую информацию, типа, кем отправлено, какой уровень, и всякое такое. И тут подумалось мне, почему бы не хранить весь...
Serjone
24
Как Вы считаете нормально ли в двадцатых годах 21 века в ВУЗах Российской Федерации обучать студентов работе с TASM? Не слишком ли это "архаично"? (Если оффтоп или флейм для э...
Spiker01
52
если загрузчик efi? если сама PML4 PDPT PDT PT лежит в неудобном для меня месте?
Vi Chapmann 🪙
8
Комрады, хотел уточнить. Проперть в OnDestroy юнита-хозяина по-прежнему доступна? И еще уточнение: finalization юнита наступает раньше или позже OnDestroy?
Ed Doc
48
А я же правильно понимаю, что инструкция AT в ld только сохраняет метаинформации о том, куда загрузить сегмент, которую далее из эльфика читает grub(ну если граб)? Но я тогда ...
Evg Resh
2
Господа, импользую кастомный загрузчик, ядро запускается сразу в длинном режиме, хочу узнать, сколько всего физической ОЗУ есть у машины. И, может, знаете какие-то подводные к...
Vi Chapmann 🪙
6
Карта сайта