yohhoyの日記

技術的メモをしていきたい日記

2018-08-01から1ヶ月間の記事一覧

アトミック、ときどきロックフリー

C++ C

C/C++標準ライブラリ提供のアトミック変数atomic<T>, atomic_Tでは、ロックフリー(lock-free)性判定マクロATOMIC_*_LOCK_FREE*1 が3状態 Never/Sometimes/Always を取りうる。C++11策定当時の提案文書N2427によれば、“ロックリーに振る舞う可能性あり”(ATOMI</t>…

hardware_{destructive,constructive}_interference_size

C++17で標準ライブラリ <new> ヘッダに追加された hardware_destructive_interference_size, hardware_constructive_interference_size について。 hardware_destructive_interference_size False-Sharing発生を防ぐために必要となる、最小のメモリアドレス距離。</new>…

C++標準ライブラリへのnodiscard属性

C++標準ライブラリにおけるnodiscard属性の使われ方についてメモ。関数戻り値の誤った破棄を警告する目的でC++17言語仕様に導入された。標準ライブラリではC++2a(C++20)からの利用となる。2018年8月現在、下記関数がnodiscard属性付与対象となっている。 ope…

文字列ビューstd::string_view 利用ガイド

C++

C++17標準ライブラリ文字列ビューstd::string_viewクラス*1利用上の注意点についてメモ。まとめ: string_viewクラス=文字列に対する読取専用のビュー。 std::stringと同じくヌル終端文字列以外も正しく取り扱える。ヌル文字を途中に含むことができる。 str…

入れ子Optionの平坦化(flatten)

プログラミング言語RustにおいてOption<Option<T>>からOption<T>へ変換する方法。 // ナイーブな実装 fn flatten<T>(x: Option<Option<T>>) -> Option<T> match x { Some(x) => x, None => None, } } // and_thenコンビネータ fn flatten<T>(x: Option<Option<T>>) -> Option<T> { x.and_then(|x| x) } // </t></option<t></t></t></option<t></t></t></option<t>…