GNU Compiler Collecrtionの最新メジャーリリースであるGCC 7.1には、現時点におけるC++17ドラフトの試験的サポート、診断メッセージの改善、新たな最適化機能など、数多くの新機能が提供さていれる – GCCのメンテナであるJakub Jelinek氏はこのように記している。
既知の事実として、GCCの安定版リリースはx.1から始まり、x.0はリリース候補用に予約されている。つまりGCC 7.1は、GCC 7の最初の安定版リリースということになる。
前述のように、GCC 7.1のC++フロントエンドでは、if constexpr
のようなフィーチャ、クラステンプレート引数の推論、auto
テンプレートパラメータ、構造化バインディングといった、現時点におけるC++17のドラフト仕様が試験的にサポートされていて、-std=c++1z
と-std=gnu++1z
フラグのいずれかで使用することができる。C++フロントエンドの新機能の全一覧が、C++ Statusのページに紹介されている。InfoQでも取り上げたように、ISO C++委員会は先頃、C++17に関する全ての作業を完了した。現在は、同組織のさまざまな国内機関による承認を待つのみの状態だ。
GCC 7にはさらに、下記のようなプロシージャ内およびプロシージャ間の最適化機能を加えて改良されたオプティマイザも導入されている。
- 一方が常に真であり、他方が常に偽であるような条件を含むループを対象とした、ループの分割(
-fsplit-loops
)。 - 指定された値域に属する変数、あるいは指定されたビット領域が0である変数に関するコールグラフの情報を伝搬する、値域(
-fipa-vrp
)およびビット単位の定数伝搬(-fipa-bit-cp
)。 - 関数の完了に至るすべてのパス上の式を可能な限り早期に評価することによる、部分冗長性除去パスの改善を目的とした、コードの巻き上げ(
-fcode-hoisting
)。 - 定義されたスコープ外での変数アドレス参照の排除を目的とした、範囲外アドレスの除去機能(
-fsanitize-address-use-after-scope
)。例:int main (int argc, char **argv) { char *ptr; { char my_char; ptr = &my_char; } *ptr = 123; //-- my_charのアドレスはここでは無効 return *ptr; }
- 汎用ベクトルの操作における算術的オーバーフロー(
-fsanitize=signed-integer-overflow
)。
診断の面に関しては、GCC 7.1ではロケーションやロケーション範囲、識別子のスペルミスに関する提案、オプション名、新たな警告といった部分が改善されている。
そして最後に、注意が必要なのは、GCC 7.1で導入された変更のいくつかについては、以前のバージョンでは正しくコンパイルできていたC++コードに問題が発生する点だ。可能性のある変更としては、テンプレート規則の厳格化、演算子の名前付け規則の変更などがある。
GCC 7.1の変更点に関するリストがchangelogに記載されている。リリースはGNUのFTPサーバから入手可能だ。
この記事を評価
- 編集者評
- 編集長アクション