GNUコンパイラコレクション(GCC)16.1が2026年4月30日にリリースされ、C++のデフォルト方言をGNU C++17からGNU C++20へ切り替えた。この変更は-stdを指定せずにビルドしている全C++プロジェクトに影響する。同リリースには1960年代に設計されたAlgol 68の実験的フロントエンドga68も追加され、最新言語規格と古典言語の支援が並行して進む異色の構成になった。AMD Zen 6-march=znver6)やIntel Nova Lake対応、階層化エラー表示のデフォルト有効化も含み、Fedora Workstation 44が先行採用している。

AD

C++20が標準方言になり、ライブラリ機能も増えた

GCC 16.1は、C++コードをコンパイルする際のデフォルト方言をGNU C++17からGNU C++20へ変更した。従来の方言を使う場合は、-std=gnu++17を明示的に指定する形になる。GCCがデフォルトを変えるのは、C++20の機能群を通常の開発フローに組み込む段階へ移したという意味を持つ。

C++ソースのビルドでは、コンパイラが標準方言をもとに構文、型推論、標準ライブラリの解釈を決める。-stdオプションを指定しない場合、GCC 16.1ではC++20を前提に処理が進む。これにより、C++20のコンセプトやレンジなどを使うプロジェクトは、設定の明示量を減らせる。コンパイラの標準方言は、ビルドシステム全体の前提条件を決める入口だ。

標準ライブラリでは、std::simdstd::inplace_vectorstd::optional<T&>std::copyable_functionstd::function_refがサポートされた。std::simdは単一命令で複数データを扱うSIMD(Single Instruction, Multiple Data)プログラミングを標準ライブラリ側から扱いやすくする機能だ。std::inplace_vectorは固定容量の領域内で要素を管理するコンテナで、動的確保を抑えたい場面に向く。

階層化されたエラー表示が標準で有効になった

C++の診断メッセージでは、GCC 15で実験的オプションだった階層構造表示がGCC 16.1でデフォルト有効になった。テンプレート展開や名前空間をまたぐエラーは、従来より入れ子関係を追いやすい形で出力される。従来の平坦な表示に戻す場合は、-fno-diagnostics-show-nestingを指定する。

Red HatのDavid Malcolmは、GCC 16のSARIF強化について「GCC 13で導入されたJSONベースの診断フォーマットであるSARIFを改善し、ネストされたロジカルロケーションを取得できるようにした」と説明している。SARIFは静的解析結果交換フォーマット(Static Analysis Results Interchange Format、SARIF)の略で、解析結果をIDEやコードレビュー環境へ渡すための形式だ。GCC 16では名前空間やスコープ単位で診断を絞り込むための情報に加え、例外処理のような非標準制御フローを表すデータも追加された。

HTML形式の診断出力も、-fdiagnostics-add-output=experimental-htmlで生成できるようになった。これはコンパイラのエラーや警告を、端末ログではなくHTMLレポートとして確認するための実験的機能だ。継続的インテグレーション(Continuous Integration、CI)の成果物として診断結果を保存する用途では、SARIFとHTMLの両方が開発現場の接点になる。

AD

Fedora 44の検証でGCC 16の性能傾向が見えた

Fedora Workstation 44は、主要LinuxディストリビューションとしてGCC 16を先行的にテストした環境の一つだ。Phoronixは2026年5月4日、AMD Ryzen Threadripper PRO 9975WXとDDR5-5600メモリを使い、GCC 15とGCC 16の比較ベンチマークを公開した。コンパイル時のフラグは-O3 -march=nativeで、生成されたバイナリの実行性能を比較している。

Phoronixの結果では、GCC 16で生成したバイナリが全般的にGCC 15より若干高い性能を示した。OpenAPVベンチマークでは一部でリグレッションが確認され、ビデオエンコードでは手動チューニングされたアセンブリの比率が高いため、コンパイラ差が出にくい傾向も示された。GCC 16の性能向上は、ワークロードの性質に左右される改善として読む必要がある。

GCC 16.1の最適化では、未カウントループのベクタライゼーション対応、早期終了を含むループ処理の改善、ベクタライゼーションロジックの堅牢化が入った。ベクタライゼーションは、ループ内の同種処理をCPUのベクトル命令へ変換し、複数データを同時に処理する仕組みだ。Link-Time Optimization(LTO)では、-flto-toplevel-asm-heuristicsによりトップレベルasmステートメントの扱いが改善された。投機的逆仮想化も汎用間接関数呼び出しへ拡張され、関数呼び出しの最適化範囲が広がった。

Zen 6、Nova Lake、MI300へ広がるハードウェア対応

GCC 16.1には、AMD Zen 6向けの初期サポートとして-march=znver6が追加された。Intel向けにはWildcat LakeとNova Lakeの-marchフラグサポートが入っている。コンパイラが新CPUの命令セットやマイクロアーキテクチャ特性を認識すると、同じソースコードからでも対象CPUに合わせた命令選択を進めやすくなる。

AMD Instinct MI300シリーズ向けには、AMDGCNバックエンドの実験的サポートが追加された。AMDGCNはAMD GPU向けのコード生成基盤で、高性能計算やアクセラレータ利用に関わる領域だ。GCC 16.1はCPUだけでなく、GPUを含むヘテロジニアス計算環境への対応範囲も広げている。

C言語側では、C23_BitInt型サポートがRISC-V、Arm、S/390、LoongArchへ拡張された。_BitIntは任意ビット幅の整数型を扱うための機能で、暗号、組み込み、低レベル処理のコードで細かな整数幅を表現しやすくする。複数アーキテクチャへの拡張は、C23機能を特定CPUに閉じない形で使うための基盤になる。

AD

C++26とAlgol 68は実験枠で同じリリースに入った

GCC 16.1では、C++26に向けたReflection、Contracts、Expansion Statements、Constexpr Exceptionsの実験的サポートが実装された。C++20モジュール機能は引き続き実験的な扱いで、利用には-fmodulesフラグが必要だ。標準化の先端にある機能と、デフォルトへ移行したC++20が同じリリース内で並んでいる点がGCC 16.1の特徴である。

Algol 68向けには、新しい実験的フロントエンドga68が追加された。Algol 68は1960年代に設計された歴史的なプログラミング言語で、現代の主要コンパイラスイートに入る例は珍しい。GCC 16.1はC++20を標準側へ押し上げる一方で、古典的言語の実装実験も取り込むリリースになった。

GCCの構造では、フロントエンドがC、C++、Fortran、Ada、今回のAlgol 68のような言語ごとの構文と意味を処理する。中間表現へ変換された後は、最適化パスとバックエンドが対象CPUやGPU向けのコード生成を担当する。新しい言語フロントエンドと新しい-march対応が同じGCC内で共存できるのは、この分業構造によるものだ。