Dmitry Develop: post #334 — TG.ME

What is the Strict Aliasing Rule and Why do we care?
(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>

ссылка на канал | ссылка на группу
February 9, 2025 407 7 1