わんくま同盟勉強会(横浜 5回)
とりあえず、メモしながら。 MFC のコードリーディングはメモ諦め。(VCインストールされてないから分からない)
http://www.wankuma.com/seminar/20130907yokohama05/
επιστημη さんのセッションだけメモ
Intel concurrent collections
かなり異色なマルチスレッドライブラリ(らしい)
- やらせたい仕事と段取りがコードの中に混在する
スケーラブルに仕立てるのが難しい。生のスレッドは基本的過ぎて扱いづらい
- CnC : IntelCOncurrentCollectionsForC++
version9 に突入したC++用窓、Linuxに対応ThreadingBuildingBlocks をベースにしている
- CnC 構成
Step : スレッド内での処理単位Item : Stepの入力/出力Tag : Step の発火装置
- Step 条件
状態を持たないitem 以外は基本使わないimmutable
- Item 性質
内部的には Hash で、キー=値のセット。これは WriteAtOnce で、一旦登録したものは変更・削除できない。キーを指定して取得するとき、値があればそのまま返るが、なければ待機する。
- Tag 性質
処理に必要なItemのキーを渡す?これを受けて、Step がFireされる。
- Step にできること
Item からの getItem への putTag を put する
実際の処理
Item 関連する Step を初期化する
- Item にパラメータを突っ込む
- Tag を打って、Step を実行する。
すると、Step が実行される。
- Step の中で何等かの処理が実行される
- Step は結果を Item に追加する
- 次のStepがあればそれでTagを打ってFireする
これを多段階層があれば Item に追記していく。呼び出し元は、Item に対して、入っているであろう結果キーでデータ取得を依頼する。
- 所感
Item をメッセージと見立てた Actor モデルの様にも見える? Item の役割が、引数と戻り値の両方を兼ねたハッシュだという所が大きく違う
VC++2013 Preview でできるようになったこと
- GCCに比べて
C++11 応は正直いいけてない、、、。
- VC++12 Previewにて
C++11 にてようやく追いついてきた
- Delegating Constructor
コンストラクタをオーバーロードした時に、他のコンストラクタをコールできる
- Unformed initialization
コンストラクタを () ではなく、{} でも書けるようになった。 配列初期化書式っぽく書ける。
- Initializer list
vector<int> value {2};
のような初期化を書くことができる。
これができるため
for(int item: {1,3,4,5}) { }
こんな書き方も出来るようになった。
- Initializer List と () コンストラクタでどっちが強い?
結論から言うと、Initializer list のほうが優先される。
vector<int> t1 {2}; vector<int> t2 (2);
上は Initializer list が動いて、要素 1 個(2を格納)され、下記はコンストラクタが動いて、
- explicit conversion
operator に explicit を指定する等すると、意図しない A + 132 とかいう処理の際に、コンパイルエラーになってくれるようです。
- enum にスコープができました
これまで enum の要素はglobal スコープになってしまうので、
enum A { a = 1, b = 2 }; enum B { a = 1, b = 2 };
はコンパイルエラーしたけど、
enum class A { a = 1, b = 2 }; enum class B { a = 1, b = 2 };
でスコープを作ることができる。
番外編
番外編で皆して「VC++12 は C++11のこれできる?」実験して、IDE上のシンタックスでは怒られないけど、コンパイラがまでコンパイルできないいくつかの書式が見つかった。 が、確定情報ではないしBlogに載せない。