|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||
Union, new placement, strict-aliasing, cross-platform18.03.2015, 22:03. Показов 1294. Ответов 5
Метки нет (Все метки)
Доброго времени суток.
Ниже представленный код вроде бы работает. Гонял его на компиляторах cl/mingw http://rextester.com/OGKQ63240
bool Holder::Empty()const ? Другими словами, может ли теоретически так получится, что валидный полиморфный объект окажется состоящим из одних нулей? Кликните здесь для просмотра всего текста
0
|
|||||||
| 18.03.2015, 22:03 | |
|
Ответы с готовыми решениями:
5
Strict aliasing и memcpy Каламбур типизации и strict aliasing
|
|
265 / 165 / 56
Регистрация: 25.02.2015
Сообщений: 435
|
|
| 18.03.2015, 22:29 | |
|
полиморфный - это который унаследован от чего-то, у чего есть виртуальные функции?
из одних нулей - это когда байтблок взять и в нем одни нули? если так, то надо смотреть, что в стандарте говорится на счет реализации виртуальности и RTTI. если метка внутри объекта - то хотябы она не может быть нулевой а должна куда-то указывать (я о vptr). если эту штуку как-то по другому хитро реализовали - то вроде бы в таком случае данные объекта могут оказаться сплошными нулями. ну и не совсем понял какое отношение это имеет к методу Empty
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||||
| 18.03.2015, 22:38 [ТС] | ||||||||||
|
у которого размер хранилища ресурсов совпадет с sizeof(void*) Может быть больше, но не меньше. В методе Clear:
Как узнать, держит ли холдер ресурс или нет? Можно глянуть: нулевой ли указатель в юнионе, или нет. Если нулевой - значит первые sizeof(void*) байт были затерты. Значит, холдер не содержит ресурс. Это будет работать только если теоретически не может быть объектов, у которых первые sizeof(void*) байт содержат нули. Если же могут существовать такие объекты, тогда данный механизм не сможет корректно распознать: захватил ли он уже ресурс, или нет.
0
|
||||||||||
|
265 / 165 / 56
Регистрация: 25.02.2015
Сообщений: 435
|
||||||
| 19.03.2015, 00:09 | ||||||
|
мысль понял. в общем тут закладка на то, что vptr в начале. я бы на это закладываться не стал.
потом еще такой глюк: буффер под объекты размера интерфейса: char mBuf[sizeof(IResource)]; а захват такой:
как только sizeof(T) > sizeof(IResource) - память покорраптится.
0
|
||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||
| 19.03.2015, 00:12 [ТС] | |||
|
так что никаких глюков.
0
|
|||
|
265 / 165 / 56
Регистрация: 25.02.2015
Сообщений: 435
|
|
| 19.03.2015, 00:36 | |
|
да, точно. на ассерты не обратил внимания.
выходит эта штука работает только с объектами без данных. и в случае, когда все RTTI дела решаются за счет внедрения vptr в объект, он будет единственным. что там с выравниваниями в этом случае - я тоже не знаю. здравый смысл подсказывает что не должно быть сюрпризов и ничего лишнего для выравнивания впихнуто не будет. но черт его знает что будет на самом деле. может там косяки пойдут из-за расположения объекта Holder или какая-нибудь экзотика встретится. в общем все хитро и изначальный вопрос остается открытым ![]() Добавлено через 12 минут как вам вариант использовать не nullptr для проверки, а адрес какой-нибудь константы или статической переменной? он ведь должен быть уникальным. врятли какой-нибудь vptr будет на нее указывать. Добавлено через 5 минут хотя это хрень наверно. может вам еще добавить статик ассерт на предмет равенства sizeof(IResource) == sizeof(void*); если равны, то это вроде бы означает, что выравнивания нет.
0
|
|
| 19.03.2015, 00:36 | |
|
Помогаю со студенческими работами здесь
6
warning: dereferencing pointer 't' does break strict-aliasing rules Cross-platform
Разработка cross platform приложения
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|
|
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога
Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
|
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога
Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|