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:
Post a Comment