本の虫

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

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

筆者にブログのネタになる品物を直接送りたい場合、住所をメールで質問してください。

C++標準化委員会の文書: P0009R3-P0099R1

P0009R3: P0009r3 : Polymorphic Multidimensional Array Reference

連続したストレージを多次元配列に見せかけるラッパーライブラリの提案。

柔軟に対応できるようにした結果、すごく使いづらいように思える。

P0019R3: P0019r3 : Atomic View

非アトミックオブジェクトに対してアトミック操作ができるatomic_viewの追加。


// 従来のコード
int data = 0 ;

atomic_view atomic_data( data ) ;

++atomic_data ;

従来のコードをatomic<T>に置き換えるのが現実的ではない場合に使える。

P0020R3: P0020r3 : Floating Point Atomic

atomicライブラリを浮動小数点数に対応させる提案。

P0022R2: Proxy Iterators for the Ranges Extensions

vector<bool>は1ビット単位で要素を格納している。イテレーターは実リファレンスではなくプロクシークラスを返す。イテレーターは実リファレンスを返すことを要件付けられているので、vector<bool>のイテレーターは真のイテレーターではなく、したがってvector<bool>も真のコンテナーではない。

実リファレンスではなくプロクシークラスを使う際の問題は、スワップ操作にあるので、iter_swapをカスタマイゼーションポイントに変えてしまえば解決できる。また、ムーブのためのカスタマイゼーションポイントとして、iter_moveを追加する。

P0037R3: Fixed-Point Real Numbers

固定少数点数、fixed_pointの提案


#include <fixed_point>

int main()
{
    fixed_point< std::uint64_t, 10 > f( 1 ), sum( 0 ) ;
    // tick = 0.0001
    auto tick = f / 10000 ; 

    // 0.0001を1万回足す
    for ( unsigned i = 0  ; i != 10000 ; ++i )
        sum += tick ;

    // 結果は1
    std::cout << static_cast<unsigned>( sum ) << '\n' ;
}

fixed_point< Rep, Exponent >という形で、Repは内部で使用する整数型、Exponentは小数点以下の2進数桁を指定する。

P0040R2: Extending memory management tools

未初期化の生のストレージ上にオブジェクトを構築したりオブジェクトを破棄するための関数テンプレートの追加。トリビアルなデストラクターであればデストラクターを呼ぶ処理をしないなどの最適化が行われる。

[PDF] P0051R2: C++ generic overload function

関数オブジェクトを登録して、登録した関数オブジェクトの間でオーバーロード解決をしてくれるoverloadライブラリの提案。


auto f = overload(
[]( int i ) { },
[]( double d ) { },
[]( std::string s ) { }
) ;

f( 0 ) ;
f( 0.0 ) ;

using std::literals ;

f( "hello"s ) ;

実装はとても簡単。

[PDF] P0057R6: Wording for Coroutines

コルーチンの文面案

キーワードがco_return, co_yeild, co_awaitなのが残念だ。

[PDF] P0059R2: Add rings to the Standard Library

ringバッファーライブラリの提案。前回と違い、ring_spanという名前になった。ring_spanは連続したストレージを受け取り、その上にリングバッファー構造を構築するラッパーライブラリだ。

[PDF] P0098R1:Towards Implementation and Use of memory order consume

タイトル通り、memory_order_consumeの実装と応用の話。もともとは、Linus TorvaldsがC/C++のatomicの仕様にケチをつけたところから始まる。Linuxカーネルでも使えるような実用的なアトミック操作を規格化するために、Linuxカーネルのメモリモデルやアトミック操作の応用を学ぶ文書が多数出た。

[PDF] P0099R1:A low-level API for stackful context switching

レジスターやスタックなどの実行環境ごと保存、リストアするスタックフルコンテキストスイッチを実現するための低レベルなライブラリの提案。

ドワンゴ広告

ドワンゴは本物のC++プログラマーを募集しています。

採用情報|株式会社ドワンゴ

CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0