本の虫

著者:江添亮
ブログ: http://cpplover.blogspot.jp/
メール: boostcpp@gmail.com
Twitter: https://twitter.com/EzoeRyou
GitHub: https://github.com/EzoeRyou

アマゾンの江添のほしい物リストを著者に送るとブログ記事のネタになる

筆者にブログのネタになる品物を直接送りたい場合の宛先:
郵便番号:165-0027
住所:東京都中野区野方5-30-13 ヴィラアテネ401
宛名:江添亮

GCC 4.9リリース

GCC, the GNU Compiler Collection - GNU Project - Free Software Foundation (FSF)

GCC 4.9がリリースされた。少なくとも、公式Webサイトのトップページからは、リリースされたことになっている。ただし、なぜかリンクをたどると

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

GCC 4.9がリリースされた。興味深い変更点を上げると。

大昔の、もはや保守もテストもされていないようなプラットフォームのサポートがobsolete扱いになった。もし、活発な活動が行われない場合、次のリリースでは取り除かれるそうだ。特に、Solaris 9が挙げられている。

Clangにある、AddressSanitizerが、ARM向けにも提供されるようになった。また、ClangにもあるUndefinedBehaviorSanitizerが、GCC 4.9にも実装された。これは、規格上の未定義動作を、実行時に検出して実行時エラーにしてくれるものである。

LTOが改良されたらしい。

Inter-procedural optimizationが改良された。これにより、virtual関数呼び出しをしなくてもいい文脈がよりよく判定できるようになったようだ。

プロファイルによる最適化にも改良があったようだ。

-fdiagnostics-colorオプションが追加され、Clangにもある、コンパイラーの出力する警告とエラーのメッセージに色を付ける機能が実装された。

C++に目を向けると、C++14の新機能が実装されつつある。C++14の新機能はまだ実験段階で、、-std=c++1yオプションを与えることで、有効にできる。

GCC 4.9では、通常の関数の戻り値の型推定機能が実装された。

// 戻り値の型はint
auto f(){ return 0 ; }

もちろん、decltype(auto)も実装された。

// decltype(auto)の例
int & f() ;

auto x = f() ; // int
decltype(auto) y = f() ; // int &

規格上、autoとdecltype(auto)は、ともにplaceholder typeと呼ばれている。autoは、初期化子から関数呼び出しのtemplate argument deductionのルールを使って、型を推定する。そのため、上記の例では、xの型はintになる。

一方、関数の戻り値の型推定に伴って追加された新しいplaceholder typeであるdecltype(auto)は、あたかも初期化子の式をdecltype( 式 )の中にいれたかのように振る舞う。つまり、この場合はdecltype(f())と同じように振る舞う。したがって、yの型はint &になる。

GCC 4.9では、lambda capture initializerが実装された。

// lambda capture initializerの例
auto f = [ x = 42 ](){ } ;

これにより、ムーブコンストラクターを呼び出すコピーキャプチャもできるようになった。

GCC 4.9では、C++14に提案されているruntime sized arrayをサポートするようになった。この結果、実行時サイズ配列がラムダでキャプチャーできるようになった。

// 例
void f( std::size_t size )
{
    int a[size] ;
    [&a](){} ;
}

GCC 4.9は、deprecated attributeをサポートした。deprecated attributeに記述できる文字列リテラルは、コンパイラーの警告メッセージに含まれる実装となっている。

// deprecated attributeの例
[[ deprecated ]] void foo() ;


[[ deprecated("bar(int) is deprecated. Use bar(bool) instead.") ]] void bar( int use_super_fast_algorithm ) ;
void bar( bool use_super_fast_algorithm ) ;

int main()
{
    foo() ;
    bar( 1 ) ;
}

GCC 4.9では、数値区切り(digit separator)をサポートした。

// digit separatorの例
int i = 123456789 ;
int j = 123'456'789 ;
int k = 0x10'000 ;

// 区切りは1文字以上なら何文字でもよい
int l = 1'22'333'4444'55555 ;

GCC 4.9では、ジェネリックラムダ、あるいはポリモーフィックラムダと呼ばれているC++14提案を実装した

// generic lambda
int main()
{
    auto f = []( auto x ) { } ;
    f( 0 ) ;
    f( 0.0 ) ;
    f( "hello" ) ;
}

その他、libstdc++も、C++11の標準ライブラリをサポートしつつあるようだ。