読者の皆様へ:ノイズを減らすための一連の機能を開発しました。関心のあるトピックについて電子メールとWeb通知を受け取ることができます。新機能の詳細をご覧ください。
GCC 8.1は、GNU Compiler Collectionの最新メジャーリリースであり、今後のC++2a標準の一部を実験的にサポートしている。さらに、GCC 8.1はプロファイル駆動型の最適化を改善し、Goサポートをバージョン1.10.1まで提供する。
GCC C++フロントエンドは、既に事前承認されているいくつかの新しいC++機能を有効にするために、-std=c++2a
と-std=gnu++2a
の2つの新しいフラグを提供する。新しい機能には、指定イニシャライザ、ビットフィールド用のデフォルトメンバイニシャライザ、プリプロセッサによるカンマ消去のための__VA_OPT__
、ラムダ[=, this]
キャプチャ、単純な暗黙のラムダキャプチャなどがある。GCC 8のC++2a機能の完全なリストについては、C++のステータスページをチェックしてください。
これに加えて、C++フロントでは診断が改善され、その改善には、ロケーションとロケーション範囲の改善や複数の新しい修正ヒントが含まれる。たとえば、コンパイラでは、定義する前にマクロを使用するとき、クラスまたは構造体のプライベートフィールドにアクセスしようとするとき、古いスタイルのキャストをstatic_cast
、const_cast
、reinterpret_cast
で置き換えることができるときに、ヒントを提供できるようになった。
GCC 8.1はプロファイル駆動型の最適化を大幅に改善している。その最適化では、コードのどの部分を最適化するかを決定するために、インスツルメントコードのパフォーマンスをプロファイリングした結果を使用する。たとえば、GCCはデフォルトでx86ターゲットの機能をホット領域とコールド領域に分割するようになった。ホット機能はより積極的に最適化され、同じ領域に配置することで局所性を改善している。その上、GCCは、あるポイントで未定義の動作をトリガするときのような、プログラムの正当な実行中に実行されないコードを検出できるようになった。
最適化については、-floop-unroll-and-jam
や-floop-interchange
のような新しいループオプティマイザが追加された。-floop-unroll-and-jam
では、外側ループのアンロールと内部ループのコピーの組み合わせを実行する。-floop-interchange
では、ループネスト内でループを交換してデータのローカリティを改善する。そして、-floop-nest-optimize
、-ftree-loop-distribution
を含むいくつかの既存のオプティマイザが改善された。これらの最適化はすべて、-O3フラグを使用するとデフォルトで有効になる。
前述のように、Goの最新の公式バージョンであるGo 1.10.1の完全な実装のおかげでGoサポートが改善された。さらに、ガベージコレクタは完全に並列実行可能となった。
最後の注目点として、GCC 8.1では、Armv8.4-Aアーキテクチャもサポートを開始し、-march=armv8.4-a
オプションを指定することで有効化される。また、Scalable Vector Extension (SVE)は、 Armv8.2-Aアーキテクチャおよびそれ以降のバージョンに対する拡張オプションとしてサポートされるようになった。
GCC 8.1には、本稿に記載できる、多くの興味深い変更がある。詳細をすべて知るには、公式のリリースノートをお見逃しなく。
Rate this Article
- Editor Review
- Chief Editor Action