|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||
Union, new placement, strict-aliasing, cross-platform18.03.2015, 22:03. Показов 1289. Ответов 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): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|