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
You can use some HTML elements, such as <b>, <i>, <a>, also, some characters need to be entity referenced such as <, > and & Your comment may need to be confirmed by blog author. Your comment will be published under GFDL 1.3 or later license with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.