C++標準化委員会の文書: P0421R0-P0429R0
P0421R0: Static class constructor
staticクラスコンストラクターの提案。
staticクラスコンストラクターは、一度だけ、main関数の実行前に実行される。
同等のことは、グローバル変数でもできるが、ヘッダーオンリーのコードで実現するためには、提案されている機能が必要になる。
クラスのメンバーという文法である必要があるだろうか。
P0422R0: Out-of-Thin-Air Execution is Vacuous
Out of thin air valueの考察
複数のスレッドで複数のアトミックオブジェクトに対するアトミック操作をmemory order relaxedで行った場合に、値が未規定になることが規格上許されているが、その結果として、絶対に起こりえない値が出てきたらどうするのかという問題。
例えば、2つの初期値がゼロのアトミック変数を複数のスレッドからお互いに間接的に代入し合った結果、人生、宇宙、すべての答えである42がでてくる可能性がある。
Java規格では10年以上も問題になっていて、未だに結論が出ていない問題。
P0423R0: Variable templates for Networking TS traits
Networking TSのtraitsに値テンプレート版(_v)が提供されていないので、提供する提案。
[PDF] P0424R0: Reconsidering literal operator templates for strings
ユーザー定義リテラルのオーバーロードに文字列リテラルを取って文字をそれぞれテンプレート実引数に渡すオーバーロードの追加の提案。
template < typename T, T ... args >
auto operator "" _udl( ) ;
// operator "" _udl< char, 'h', 'e', 'l', 'l', 'o', > ;
"hello"_udl ;
この提案は、C++14にも提案されたが、コンパイル時に文字列を扱う機能が必要だとして却下された。そのような特別な機能は必要ないので当時の提案をそのまま入れるべきだと主張しているのがこの文書。
P0426R0: Constexpr for std::char_traits
string_viewをconstexpr対応させるために、char_traitsのメンバー、length, compare, findをconstexprにする提案。
[PDF] P0428R0: Familiar template syntax for generic lambdas
lambda式にテンプレートを記述できる機能の提案。
[]<typename T >(T x ) { } ;
もともと、C++14に入ったジェネリックラムダの提案に含まれていた機能だが、C++14ではautoを使ったジェネリックラムダだけが入った。しかし、引数の型を扱いたい場合に、autoだけでは不便なので、テンプレートも明示的書けたほうがよい。
[PDF] P0429R0: A Standard flat_map
連続したストレージ上に構築されたソート済みの要素をバイナリサーチすることによる連想コンテナー実装、flat_mapの提案。Boostにあるものが土台になっている。
flat_mapと従来のmapのベンチマーク結果があるが、要素の挿入と削除はとても遅く、イテレートはとても速く、検索はmapより速いがunordered_mapよりは遅い結果となっている。そのデータ構造から考えて予想通りの特性だ。
また、メモリ使用量が少ない。これは当然の話で、mapを素直に実装するには左右の葉ノードと親ノードへの3個のポインターを持つノードによるバイナリツリーになる上に、メモリ確保をノード単位で行うためにメモリ管理のためのメモリも必要になる。また、連続したストレージ上に確保されるためキャッシュの局所性が最高だ。
多くのmapを使うところでは、flat_mapをデフォルトで使ったほうがいいのではないかと思う。
ドワンゴ広告
ドワンゴは本物のC++プログラマーを募集しています。
CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0