yohhoyの日記

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

2012-05-01から1ヶ月間の記事一覧

f()とf(void)

C++

C++言語における引数を取らない関数のパラメータリスト。f1とf2の関数シグネチャは同一。 int f1(); int f2(void); int (*pf)(void) = f1; // OK int (&rf)() = f2; // OK パラメータリスト中でvoid型を使えるのは“空のパラメータリスト”を表す場合のみ。 in…

参照渡し or 値渡し?

C++

C++03/11における関数の引数型とコピー/ムーブ処理コストとの関係について。本記事の内容は C++Now 2012 Keynote: "Moving Forward with C++11" スライド資料(Part I, Part II) に基づく。(Part IIのpp.22-57)型Tに対する変更操作を行う関数において、引…

ムーブ不可&コピー不可なオブジェクトを扱う

C++

C++11でムーブもコピーもできないオブジェクトを扱う方法についてメモ。(エッセンスのみ。詳説は元記事を) 実は C++0x では、こういう「コピーもムーブも出来ないオブジェクト」であっても、 uniform initialization を使えば、関数から返すことができるよ…

メモリモデルとThin-air read

C++

C++11メモリモデルと、atomic変数relaxedメモリ操作で起こりえる "Thin-air read" への対策について。注意:本記事は内容を理解して書いたわけでなく、関連情報の単なるメモ。 "Thin-air read"(または "out-of-thin-air value")は定式化されたメモリモデル…

shared_ptrとスレッド安全性

C++11標準ライブラリのスマートポインタstd::shared_ptrでは、C++標準ライブラリの既定レベルのスレッド安全性(→id:yohhoy:20120513)を提供する。 同一オブジェクトを指していたとしても、異なる2つのshared_ptrオブジェクトは異なるスレッドからそれぞれ…

C++11標準ライブラリのスレッド安全性

C++

C++11標準ライブラリが提供する機能とスレッド安全性(thread safety)についてのメモ*1。C++03以前では処理系依存。要約:C++標準ライブラリのオブジェクトでは、少なくとも言語組み込みint型と同様のスレッド安全性を提供する。 基本的なスレッド安全性 C++…

detachスレッドとプログラム終了処理

C++

C++11におけるdetach済みスレッドとexit関数で引き起こされる問題についてメモ。あるスレッドでstd::exit関数が呼ばれて終了処理中に、残存するdetach済みスレッドがライブラリ関数を呼び出して未定義動作を引き起こす危険性がある。下記の回避策がありえる…

C++11標準ミューテックスとtry_lockの微妙な話

C++

C++標準ライブラリが提供するミューテックス型*1に対するロック試行操作try_lockメンバ関数は、ロック獲得可能なときでも失敗する可能性がある(spurious failure)*2。N3337 30.4.1.2/p16より引用。(下線部は強調) 16 Effects: Attempts to obtain ownershi…

nullptr推奨@C++11

C++11で新たに追加されたnullptrキーワード(→id:yohhoy:20120503)利用促進のため、gcc 4.7から新しい警告オプション -Wzero-as-null-pointer-constant が追加された。 C++ A new command-line option -Wzero-as-null-pointer-constant has been added to w…

どれがコピー/ムーブコンストラクタ?

C++

C++11言語仕様において、どのようなコンストラクタが “コピーコンストラクタ”/“ムーブコンストラクタ” とみなされるのかについてメモ。 コピーコンストラクタ 第1引数にX&, const X&, volatile X&, const volatile X&のいずれかをとる非テンプレートなコン…

条件変数とダンス(Two-Step Dance)を

条件変数(condition variable)同期プリミティブに対する待機/通知で発生する現象と回避策のメモ。条件変数とミューテックスを使ったコードにおいて次のような現象が生じる。 スレッドAが条件変数cvに対して通知を行う。 条件変数cvに対してブロックされてい…

nullptrキーワード

C++

C++11で新たに導入されたnullptrキーワードおよびstd::nullptr_t型に関するメモ。まとめ: nullptrキーワードはヌルポインタ定数を表すポインタリテラル。C++03以前の値0, マクロNULLとは別に新たに追加された。 nullptrの型はstd::nullptr_t型と定義される…

リスト内包表記と変数スコープ

プログラミング言語Pythonにおけるリストの内包表記と変数スコープの関係についてメモ。 x = 42 a = [x for x in range(1,10)] print(x) Python 2.x系: 9 2020-01-01をもって Python2はEOL Python 3.x系: 42 In Python 2.3 and later releases, a list compr…