Доклад

Алиасинг памяти в C++: прошлое, настоящее и будущее

Алиасинг — одна из самых важных и при этом до сих пор недостаточно хорошо понимаемых тем в системном программировании. Проблема контроля алиасинга существует во всех языках программирования, работающих с памятью напрямую. Однако в C++ она становится существенно сложнее: модель объектов, время жизни, преобразования типов и богатый набор низкоуровневых возможностей создают среду, в которой механизмы контроля алиасинга могут быть как мощным инструментом оптимизации, так и источником труднообнаружимых ошибок.

Правильно используемый контроль алиасинга позволяет предоставлять компилятору больше свободы для оптимизаций, что ведет к улучшению производительности программ, а также делает код более предсказуемым и частично самодокументируемым. С другой стороны, ошибки в этой области могут приводить к неожиданной деградации производительности или к undefined behavior, которое проявляется только при определенных оптимизациях или на конкретных платформах.

В C++ модель алиасинга формируется сразу несколькими слоями: 1) strict aliasing, 2) оптимизационные модели компиляторов (TBAA, noalias, alias scopes), 3) нестандартные расширения компиляторов, такие как __restrict. В докладе мы разберем, как компиляторы (GCC, Clang, MSVC) принимают решения об алиасинге и что может сделать программист, чтобы сделать свой код более быстрым и, что также важно, безопасным.

Отдельное внимание будет уделено современным обсуждениям в стандарте C++ (restrict-like семантика, alias sets, свойства доступа для span/mdspan, pointer provenance), В докладе будут использоваться примеры кода на C++23, выдержки из последнего стандарта C++, а также фрагменты LLVM IR для объяснения работы оптимизатора.

Доклад ориентирован на практическое применение знаний об алиасинге при написании высокопроизводительного и системного C++ кода.

Спикеры

Расписание