После года разработки опубликован выпуск свободного набора компиляторов GCC 16.1, первый значительный выпуск в новой ветке GCC 16.x. В соответствии со схемой нумерации выпусков, версия 16.0 использовалась в процессе разработки, а незадолго до выхода GCC 16.1 уже ответвилась ветка GCC 17.0, на базе которой будет сформирован следующий значительный релиз GCC 17.1.
Основные изменения:
- Режим по умолчанию для языка C++ переключён на использование стандарта C++20 (диалект GNU C++20,
-std=gnu++20) вместо ранее предлагавшегося C++17. Реализация C++20 в стандартной библиотеке объявлена стабильной. - В состав включён экспериментальный фронтэнд ga68 для компиляции программ на языке программирования Алгол 68 (Algol 68).
- Добавлена возможность вывода диагностической информации в формате HTML. Расширена информация о ходе выполнения программы, включаемая при выводе диагностики в формате SARIF, основанном на JSON (поддержка
-fdiagnostics-format=jsonпрекращена). - Расширены оптимизации на этапе связывания (LTO, Link-Time Optimization). Добавлена опция
-flto-toplevel-asm-heuristics, включающая эвристику для улучшения оптимизации кода с ассемблерными вставками. Техника спекулятивной девиртуализации (-fdevirtualize-speculatively) теперь не ограничена преобразованием виртуальных методов и может применяться при преобразовании в прямые вызовы любых косвенных вызовов функций, например, вызовов через указатели. - Реализована поддержка векторизации циклов, для которых на этапе компиляции неизвестно число итераций. Повышена эффективность обработки досрочных выходов из цикла (например, через
break). - Добавлена экспериментальная поддержка многих возможностей недавно утверждённого стандарта C++26. Например, реализованы:
- Рефлексия (Reflection,
-freflection), позволяющая отслеживать и модифицировать элементы программы на стадии компиляции. Добавлены новые операторы «^^ (open-std.org)» для получения метаинформации о грамматической конструкции и «[:…:]» для выполнения обратного преобразования. Для преобразования и обработки полученной в ходе инспектирования информации предложена библиотекаstd::metaи доступны такие возможности, как вычисления с константами. - Контрактное программирование (Contracts), позволяющее определять формальные спецификации интерфейсов при помощи трёх новых операторов:
pre(предусловие),post(постусловие) иcontract_assert(проверка утверждения). Операторpreопределяет предварительные условия, которые должны быть выполнены перед вызовом (проверка входных данных);post– условия, которые должны соблюдаться после выполнения (требования к выходным данным);contract_assert– условия возникновения исключений. Возможность появится в GCC 16. - Оператор «template for» для перебора элементов, таких как пакеты параметров, похожие на кортежи объекты и результаты рефлексии (метаобъекты), на этапе компиляции в стиле обычного цикла. При выполнении
template forтело цикла раскрывается для каждого элемента и каждая итерация обрабатывается в отдельной области видимости, в которой элемент последовательности, по которой итерируется цикл, является константой для каждой итерации и может участвовать в константных выражениях (constexpr). В контексте рефлексииtemplate forможет применяться для обхода свойств классов или перечислений. - Улучшена поддержка модуля
std::simdдля распараллеливания выполнения операций над данными при помощи наборов инструкций SIMD, таких как AVX-512 и NEON, с использованием стандартной системы типов C++. - Улучшена поддержка
std::inplace_vector,std::optional<T&>,std::copyable_function,std::function_ref,std::indirect,std::polymorphicиstd::owner_equal.
- Рефлексия (Reflection,
- Реализованы возможности, связанные со стандартом C++23, такие как явное управление временем жизни объектов и поддержка указания кодировки символов диагностических сообщений.
- Расширена поддержка стандарта C23 (opennet.ru), например, реализована возможность использования атрибута
counted_byдля проверки корректности использования указателей. - Продолжена реализация стандартов OpenMP 5.0, 5.1, 5.2 и 6.0 (Open Multi-Processing), определяющих API и способы применения методов параллельного программирования на многоядерных и гибридных (CPU+GPU/DSP) системах с общей памятью и блоками векторизации (SIMD). Улучшена реализация спецификаций параллельного программирования OpenACC 3.0, 3.3 и 3.4, определяющих средства для выноса операций (
offloading) на GPU и специализированные процессоры, такие как NVIDIA PTX. - В бэкенд для архитектуры x86 добавлена поддержка процессоров AMD на основе микроархитектуры Zen6 (
-march=znver6), а также процессоров Intel Wildcat Lake (-march=wildcatlake) и Nova Lake (-march=novalake). - В бэкенде генерации кода для GPU AMD Radeon (GCN) реализована поддержка ускорителей AMD Instinct MI300 (gfx942).
- Для архитектур RISC-V, ARM, S/390 и LoongArch реализована поддержка типа
_BitInt (N)для определения целых чисел с указанным числом битов.













