(OR Type Punning, Undefined Behavior and Alignment, Oh My!)
https://gist.github.com/shafik/848ae25ee209f698763cffee272a58f8
Смотрел ещё недавно по этой теме трансляцию Ильи Мещерина и доклад на C++ Russia от Романа Русяева, поэтому чуть-чуть контекст, причины, цели и последствия понял.
Просто мозг взрывается от strict aliasing rule.
Очень, очень много правил, которые легко нарушить.
Единственные совместимые со всеми другими типами являются только
char, unsigned char, or std::byte.Про signed
char, int8_t и uint8_t в стандарте ни слова.Не могу понять, почему нельзя перекрывать объект через
signed char?Да и знаковость char implementation defined, если не ошибаюсь, или просто не указана.
По идее, если для этого типа нет исключения, то будет undefined behavior.
Мне очень хотелось бы работать с байтами именно через типы-псевдонимы из
stdint.h (cstdint), в которых, оказывается, нет псевдонима байта.Хотя через минуту я вспомнил и понял, что: байт != 8 бит, поэтому на эту роль
uint8_t не подойдёт. Да и в статье упоминается, что эти псевдонимы могут, но не обязаны быть реализованы через
char.Ещё интересно, а можно ли как-то обойтись без
placement new, std::launder, std::memcpy, чтобы не нарушить strict aliasing и реализовать, например, сериализацию и десериализацию?Возможно, я просто заблуждаюсь и все проблемы от незнания, но я до сих пор воспринимаю те сущности просто, как часть стандартной библиотеки, как будто просто функцию, а не какое-то особенное ключевое слово, от которого никак не избавишься, не обойдёшься без, не переопределишь, не напишешь свою реализацию.
И ещё скорее всего из-за моего идеалистического взгляда на C++ и желаемый способ написания кода.
Where can I find what std::launder really does?
A byte type: std::byte vs std::uint8_t vs unsigned char vs char vs std::bitset<8>
ссылка на канал | ссылка на группу