std::hypotC++11で追加されたstd::hypotに3引数版のオーバーロードを追加する提案。y^2}\)を、計算過程でオーバーフロー、アンダーフローが発生しない方法で計算する関数だ。z_2)^2}\)したいことがよくある。;}hypotに3引数版のオーバーロードを追加すると、以下のように書ける。templatesを利用した任意個の引数を取る汎用的な関数の提案も考えたが、そのような関数の利用例が明らかではないとして、今回の提案では3引数版のみにとどめたという。move_iteratorをconstexprに対応させる提案。optionalには、機能は同じだがメンバー名や引数などが異なるメンバーがあるので、統一を図る。shared_from_this現行のenable_shared_from_thisの文面では、挙動が明確に規定されていないコードが存在してしまう。enable_shared_from_thisは、shared_ptrで管理する型の基本クラスとすることで、shared_from_thisというメンバー関数を追加できる。このメンバー関数を呼び出すと、そのオブジェクトを所有している既存のshared_ptrが返される。}ところが、現行の文面では、以下のようなコードの挙動が未定義になってしまう。#3}shared_from_thisの前提条件として、オブジェクトを所有するshared_ptrのオブジェクトが存在しなければならない。このコードでは、存在している。問題は、複数のshared_ptrが独立して存在しているということだ。後から構築される#2のオブジェクトのデリーターは何もしないので、このコードは二重にdeleteするという問題はない。すると、このコードは合法なのだろうか。合法だとして、この場合はどちらのshared_ptrと所有権を共有するオブジェクトが返るのだろうか。#1だろうか、#2だろうか。#1が返る場合、#2のshaared_ptrの構築時には、xraw->_weak_thisがアップデートされないことになる。#2が返る場合、アップデートされる。問題は、shared_from_thisのpostconditionに照らし合わせると、どちらの挙動もweak_ptrがらみのpostconditionを満たせないので、規格上挙動が規定されていない。LLVMの実装は、いずれも#2が_weak_thisをアップデートする挙動になっている。これは設計上意図的なものではない。Boostの実装では、ユーザーの意見を取り入れた結果、#2は_weak_thisをアップデートしない挙動に意図的にしている。最初に作られたshared_ptrと所有権を共有するshared_ptrを返す。現在、既存の実装の挙動に依存したコードはなく、Boostの挙動の方が実際の需要があるため、Boostの挙動にあわせる変更を提案している。この提案では、weak_ptrを得るweak_from_thisの追加も提案されている。Time軽量な日付ライブラリの提案。Timeはあまりにも巨大すぎるし、作者が標準ライブラリに追加することに興味を示していないので、軽量な日付ライブラリを提案している。このライブラリは、グレゴリオ暦以前の日付はtime_tのオーバーフロー、time_t以上の精度でうるう秒を扱うことは考慮しない。タイムゾーンが使える。data待望のオーバーアライメントしてくれる確保関数の提案。C++の現行規格では、確保関数はオーバーアライメントする必要はない。floatのアライメントが4バイトで、SIMD命令の都合上、floatの配列を16バイトアライメントしたいとする。以下のようなコードを書いても、16バイトアライメントされる保証はない。float4[1000];C++の規格上は4バイトアライメントされれば十分なのだ。オーバーアライメントは規格上必須ではない。シグネチャは以下のようになる。デフォルトで0が変えるとまずい場合がある。Fixed_Point_Library_Proposal固定少数点ライブラリの提案。;ReprTypeは内部でつかう整数型で、Exponentは、ビットを指定された数だけシフトする。Exponent)にstd::numeric_limites<ReprType>::min()/max()を掛けた値になる。Exponentを指定するのは面倒だ。固定少数は、基数ビット数と少数ビット数を記述することで指定できる。プログラマーの多くはこの記述方法を好む。そこで、fixed_pointのエイリアスが用意される。;固定少数と組み込みの整数型は相互に明示的に変換できる。4>(0)このコードは丸められた結果trueとなり得る。整数に普通に使える演算子は固定少数にもオーバーロードされていて普通に使える。シフト演算子と比較演算子以外では、二項演算子は固定少数同士や、固定少数と他の演算型を組み合わせてオペランドに取れる。組み合わせが同じ固定少数型ではない場合、簡単なプロモーション風のルールによって、戻り値の型が決定される。どちらの実引数も固定少数の場合、大きなサイズの型が選ばれる。提案では、このプロモーションルールの理由を、挙動を簡単に推測できるためとパフォーマンス上の理由から、各ルールについて以下のように説明している。固定少数のみが使われていた場合に、最小の計算のみが行われることを保証する。型を混ぜた演算のプロモーションルールをまねた。固定少数の範囲から外れるようなexponentを持つ値も作り出せるようにし、浮動小数点数から整数へのコストのかかる変換を避ける入力として与えられた固定少数型を維持する。処理に重要なのは意図的に固定少数型であるシフト演算子は右辺に整数型を取り、オーバーフロー、アンダーフローしない新しい型を返す。比較演算子は、プロモーションルールにしたがって入力を共通の型に変換した上で、比較して、結果をtrueかfalseで返す。符号付きと符号なしの固定少数のオーバーフローは、未定義の挙動となる。符号なしの整数型のオーバーフローの挙動が規定されている基本型とは異なる。3>(1)アンダーフローが発生して精度が失われることは許容されている。;この結果は7になるが、これは許容されている。すべてのビットがアンダーフローによって失われた場合、その値は「フラッシュされた」状態になり、未定義の挙動となる。固定少数の精度を上下させるpromote/demote関数がある。これは、基数部と小数部のビット数をそれぞれ、2倍、1/2倍する。;オーバーフローを防ぐために精度を上げつつ計算する関数が用意されている。promote_dividetrunc_は、入力よりも大きくはない結果を返すが、exponent部分をオーバーフローを避けるために変更される。promote_は、オーバーフローとアンダーフローが起きないほど十分に大きな型を結果として返す_multiplyと_squareは、64bit型には提供される保証がない。_multiplyと_squareは、入力が最小負数である場合、未定義の挙動となる。_squareは符号なし型を返す_divideと_reciprocalは、ゼロ除算チェックは行わないtrunc_shift_は、最初の入力と同じ型を返す。関数はまだ追加される余地がある。flat_multiset)の追加。フラット連想コンテナーとは、従来の連想コンテナーであるmapやsetのように、キーと対応する値をもっていて、キーによって値を高速に検索できる特性を持つ。従来のノードベースの連想コンテナーと違い、連続したストレージ上に要素が確保される。ひとつは要素を常にキーでソート済みにしておくこと。ひとつはヒープ構造を用いること。Boostの実装はソートを使っている。ヒープを使った実装はキャッシュのローカル性を保ちやすいので、理論上優れた実装であるとされ、会議では関心が高かったが、実装経験が少ないため、さらなる検証が必要であるとしている。raw_storage_iteratorraw_storage_iteratorを改良する提案。raw_storage_iteratorにムーブ代入演算子を追加し、ムーブに対応させる。raw_storage_iteratorを作るのは面倒なので、factory関数を追加する。newの文法はraw_storage_iteratorをサポートしていない。これを直接サポートする。);}ドワンゴ広告この記事はドワンゴ勤務中に書かれた。来月は有給を取りまくる必要のある事情がある。ドワンゴは本物のC++プログラマーを募集しています。said...オーバーフローの例とアンダーフローの例が同じだったり、promoteとdemoteに誤りがある様に見受けられます。said...hypotが地味に面白そうですね。arrayがconstexpr対応っていうのは良対応ですね。固定少数ライブラリですけど、最近半精度少数が流行ってるそうですがちゃんとした規格がないように思います。その対応として使えるものになるのでしょうか?コンテナですけど、早くリングバッファ入らないですかね。使いたい用途があるので期待してマース。それと検索の都合でよくmapを使うのですが、これがフラットになるとバイナリ探査が使えてもっと早くなるとかそういうことにはならないんでしょうかねぇ??ヒープって検索に向いてたかちょっと失念してるんですけど、Mapには検索速度重視で設計してほしいです。フラットにするんだったら、インデックスドリンクドリストなんかも効率と微妙に相反してたりしますかね??あと、地味に日付ライブラリには期待してます。自分で書くとめちゃくちゃめんどくさいので。said...最近(?)流行りのGPGPU、OpenCLや3Dグラフィックスなどで使用されるhalfは浮動小数点です。16bit浮動小数点はIEEE754標準で規格化されています。P0037R0は固定小数点なので異なります。(Atom)C++11参考書C++11の参考書、アマゾンお気に入りリストを公開中。アマゾンの江添のほしい物リストC++11の参考書、C++の文法と機能をGitHubで公開中。EvangelistC++標準化委員会の委員ドワンゴ社員C++11本を執筆した。株式会社ドワンゴで働いている。江添のほしい物リスト筆者にブログのネタを提供するために、直接に品物を送りたい場合、住所をメールで質問してください。Texts.ただし、必要である範囲において他の著作物を引用していることがあります。