2013-03-17

GCC 4.8のリリースノートとC++関連の変更

GCC 4.8 Release Series — Changes, New Features, and Fixes - GNU Project - Free Software Foundation (FSF)

GCC 4.8のリリースノートから興味深い点を紹介する。

まず、GCC 4.8は、C++で書かれるようになった。これはつまり、GCC 4.8のビルドには、C++03に準拠したコンパイラーが必要になる。

GCC 4.8は、ループ最適化の方法として、ループ回数の上限をaggressiveに解析するようになった。これは言語規格で許されている範囲の実装である。これにより、既存の規格違反のプログラムが正しく動かなくなる。たとえば、SPEC CPU 2006の464.h264ref (H.264のリファレンスエンコーダーを流用したSPECのベンチマーク)や、同じくSPECのベンチマークである416.gamessが動かなくなる。この最適化を無効にするオプション、-fno-aggressive-loop-optimizationsが追加されている。

C++としては、

thread_local

struct X
{
    int x ;
} ;

thread_local X x ; // スレッドごとに別のストレージ上に確保される

attribute(alignasも含む)

[[ noreturn ]] void f() ;

alignas(16) char a[64] ; // 16バイトにアライン
alignas(double) char b[sizeof(double)] ; // doubleのアライメント要求を満たすようにアライン。

Inheriting Constructors(継承コンストラクター)

struct A { A(int) ; } ;
struct B : A { using A::A ; }

B b( 123 ) ; // OK

名前通り、基本クラスのコンストラクターを継承することができる。

さらに、次期C++規格の実験的な実装を有効にする。-std=c++1yオプションが追加されている。現在のところ、通常の関数でも戻り値の型の推定を行う提案、N3386が実装されている。lambda式ができるのだから、普通の関数でもできるべきだろう。

// C++11の機能
// 戻り値の型がreturn文からintに推定される
[](){ return 0 ; } ;

// N3386の提案
// 戻り値の型がreturn文からintに推定される。
auto f() { return 0 ; }

また、N3386では、関数本体に複数のreturn文が使われていたり、再帰する場合でも、return文の推定ができるようになる。

[]( bool b )
{
    if ( b )
    {
        return 100 ;
    }
    else
    {
        return 200 ;
    }
} ;

この場合、どちらのreturn文もint型であるのだから、当然戻り値の型は推定できるべきだし、

auto f( unsigned int n )
{
    if( n == 0 )
    {
        return 0 ;
    }
    else
    {
        return f( n - 1 ) ;
    }
}

このような再帰関数の場合も、やはり戻り値の型はint型以外にはありえないから、当然推定できる。

また、inline namespaceは以前から実装されていたが、それを受けてGCCの独自拡張である__attribute ((strong))はdeprecated扱いになった。

また、ライブラリとしては、forward_listが実装されたり、randomの実装がSSE最適化されたりしているそうだ。

No comments: