SlideShare una empresa de Scribd logo
1 de 18
Descargar para leer sin conexión
Boost.破壊的関数呼び出し

   くらいおらいと
注意
「それ○○でできるよ」「それ○○がす
でに言ってたよ」と言われた時点で本
発表は強制終了します
前提知識
• C++0x
  –ムーブセマンティクス (右辺値参照)
  –右辺値参照 on *this
• Boost
  –Boost.Bind
  –Boost.Thread
  –Boost.Asio
  –Boost.ScopeExit
Motivation
 下記のコードが通らなくて大変悲しい

void thread_main(std::unique_ptr<int> p)
{
  …
}


std::unique_ptr<int> p(new int(42));
auto f = boost::bind(&thread_main, std::move(p));
boost::thread  th(f); // コンパイルエラー
Motivation
 下記のコードが通らなくて大変悲しい

void thread_main(std::unique_ptr<int> p)
{
  …
}
  このパタン (非同期呼び出しにおける
 所有権の移動) は超重要

std::unique_ptr<int> p(new int(42));
auto f = boost::bind(&thread_main, std::move(p));
boost::thread  th(f); // コンパイルエラー
何が問題か?
boost::bind が呼び出し時に束縛され
た引数をコピーしようとする
(+ boost::bind が内部で束縛されたオ
ブジェクトをコピーする)
                 ↓
std::unique_ptr はコピーできないので
アボン
5分で考えたオレオレアイデア
boost::thread の実装では,スレッド関
数呼び出し時に boost::bind が束縛し
ている引数オブジェクトを破壊しても
大丈夫なはずだ
Boost.Thread 内部実装(テキトー)
// Boost.Thread の内部実装

// thread_callback はコールバック
// a1, a2 は引数
thread_callback(a1, a2, …);
// thread_callback は
// これ以降一切呼び出されない
俺が考えた最強の
       Boost.Thread 内部実装
// Boost.Thread の内部実装

// thread_callback はコールバック
// a1, a2 は引数
std::move(thread_callback)(a1, a2, …);
// thread_callback は
// これ以降一切呼び出されない
Move とは
Move できる
Movable

   +

Move を利用する
Move‐aware
破壊的関数呼び出し とは
破壊的に呼び出せる
DestructivelyCallable

       +

破壊的呼び出しを利用する
Destructive‐Call‐aware
boost::bind 側
      破壊的に呼び出せる
template<…>
class bind_wrapper {
  …
  template<…>
  void opeartor()(…) &&
  …
};
Boost.Thread 側
     破壊的呼び出しを利用する
// Boost.Thread の内部実装

// thread_callback はコールバック
// a1, a2 は残りの引数
std::move(thread_callback)(a1, a2, …);
あるコンポーネントが
 破壊的呼び出しを利用できる条件


指定された callback を破壊的に呼び
出してよいのは, callback を高々1回
しか呼ばないとき
破壊的関数呼び出しができる例
              =
 callback を高々1回しか呼ばない例

• Boost.Thread
• Boost.Asio のイベントハンドラ
• スコープガードに指定するコール
  バック (Boost.ScopeGuard)
• (std::async)
破壊的関数呼び出しのまとめ
• Boost.Bind に対して move on *this 
  による operator() のオーバーロード
  を追加
• Boost.Thread, Boost.Asio, 
  Boost.ScopeExit の実装の該当箇所
  に std::move なパッチを当てる
破壊的関数呼び出しの利点

• 後方互換性を完全に維持したまま,
  既存のコンポーネントの適用範囲を
  広げる
• 特に非同期関数呼び出しにおける
  所有権の移動が非常に扱いやすく
  なる
今後の予定
• 誰も言ってないっぽいなら Boost に
  Asio と Thread と ScopeGuard のパッ
  チ付きで提案して殴り込みをかける
• 返り討ちにあう
• それでもがんばる
• move on *this が clang++ にしか実
  装されていないのでさようなら(^o^)ノ

Más contenido relacionado

La actualidad más candente

【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」
【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」
【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」fukuoka.ex
 
2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)
2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)
2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)Shin-ya Koga
 
クロージャデザインパターン
クロージャデザインパターンクロージャデザインパターン
クロージャデザインパターンMoriharu Ohzu
 
C++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプC++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプKohsuke Yuasa
 
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかYuki Miyatake
 
C++11概要 ライブラリ編
C++11概要 ライブラリ編C++11概要 ライブラリ編
C++11概要 ライブラリ編egtra
 
2021 10-12.linx device-tree
2021 10-12.linx device-tree2021 10-12.linx device-tree
2021 10-12.linx device-treeShin-ya Koga
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14Ryo Suzuki
 
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチンyohhoy
 

La actualidad más candente (20)

【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」
【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」
【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」
 
PHPにおけるI/O多重化とyield
PHPにおけるI/O多重化とyieldPHPにおけるI/O多重化とyield
PHPにおけるI/O多重化とyield
 
Map
MapMap
Map
 
animation1.0
animation1.0animation1.0
animation1.0
 
Boost Tour 1_58_0 merge
Boost Tour 1_58_0 mergeBoost Tour 1_58_0 merge
Boost Tour 1_58_0 merge
 
Emcpp item31
Emcpp item31Emcpp item31
Emcpp item31
 
Boost Fusion Library
Boost Fusion LibraryBoost Fusion Library
Boost Fusion Library
 
2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)
2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)
2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)
 
Aio
AioAio
Aio
 
クロージャデザインパターン
クロージャデザインパターンクロージャデザインパターン
クロージャデザインパターン
 
C++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプC++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプ
 
Boost Tour 1.53.0
Boost Tour 1.53.0Boost Tour 1.53.0
Boost Tour 1.53.0
 
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうか
 
Boost Tour 1.53.0 merge
Boost Tour 1.53.0 mergeBoost Tour 1.53.0 merge
Boost Tour 1.53.0 merge
 
node-perl
node-perlnode-perl
node-perl
 
C++11概要 ライブラリ編
C++11概要 ライブラリ編C++11概要 ライブラリ編
C++11概要 ライブラリ編
 
2021 10-12.linx device-tree
2021 10-12.linx device-tree2021 10-12.linx device-tree
2021 10-12.linx device-tree
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
 
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
 
Slide
SlideSlide
Slide
 

Destacado

Virtual learning spaces: example of international collaboration
Virtual learning spaces: example of international collaborationVirtual learning spaces: example of international collaboration
Virtual learning spaces: example of international collaborationguestcd29992
 
Focus
FocusFocus
Focusopiv
 
Pop it, drop it, make it fly
Pop it, drop it, make it fly Pop it, drop it, make it fly
Pop it, drop it, make it fly Springside School
 
Put The Glass Down
Put The Glass DownPut The Glass Down
Put The Glass Downchamarah
 
Chris Di Alfredi Resume And Portfolio Sample November 2010
Chris Di Alfredi Resume And Portfolio Sample   November 2010Chris Di Alfredi Resume And Portfolio Sample   November 2010
Chris Di Alfredi Resume And Portfolio Sample November 2010chrisdialfredi
 
Boost.PropertyMap (.pdf)
Boost.PropertyMap (.pdf)Boost.PropertyMap (.pdf)
Boost.PropertyMap (.pdf)Cryolite
 
Focus
FocusFocus
Focusopiv
 
左と右の話
左と右の話左と右の話
左と右の話Cryolite
 
Boost.PropertyMap (.pptx)
Boost.PropertyMap (.pptx)Boost.PropertyMap (.pptx)
Boost.PropertyMap (.pptx)Cryolite
 
Thoughts Of Consciousness
Thoughts Of ConsciousnessThoughts Of Consciousness
Thoughts Of ConsciousnessleonyRU
 
shared_ptr & weak_ptr (ppt 初版, DL 専用)
shared_ptr & weak_ptr (ppt 初版, DL 専用)shared_ptr & weak_ptr (ppt 初版, DL 専用)
shared_ptr & weak_ptr (ppt 初版, DL 専用)Cryolite
 
Job Tumber, Llc – Partner Opportunity
Job Tumber, Llc – Partner OpportunityJob Tumber, Llc – Partner Opportunity
Job Tumber, Llc – Partner Opportunityjobtumbler
 

Destacado (16)

Virtual learning spaces: example of international collaboration
Virtual learning spaces: example of international collaborationVirtual learning spaces: example of international collaboration
Virtual learning spaces: example of international collaboration
 
Focus
FocusFocus
Focus
 
Biography
BiographyBiography
Biography
 
Flipvideo101
Flipvideo101Flipvideo101
Flipvideo101
 
Pop it, drop it, make it fly
Pop it, drop it, make it fly Pop it, drop it, make it fly
Pop it, drop it, make it fly
 
Put The Glass Down
Put The Glass DownPut The Glass Down
Put The Glass Down
 
Chris Di Alfredi Resume And Portfolio Sample November 2010
Chris Di Alfredi Resume And Portfolio Sample   November 2010Chris Di Alfredi Resume And Portfolio Sample   November 2010
Chris Di Alfredi Resume And Portfolio Sample November 2010
 
Boost.PropertyMap (.pdf)
Boost.PropertyMap (.pdf)Boost.PropertyMap (.pdf)
Boost.PropertyMap (.pdf)
 
Focus
FocusFocus
Focus
 
Ciri Ciri Masa Puber
Ciri Ciri Masa PuberCiri Ciri Masa Puber
Ciri Ciri Masa Puber
 
Chiense Tea
Chiense TeaChiense Tea
Chiense Tea
 
左と右の話
左と右の話左と右の話
左と右の話
 
Boost.PropertyMap (.pptx)
Boost.PropertyMap (.pptx)Boost.PropertyMap (.pptx)
Boost.PropertyMap (.pptx)
 
Thoughts Of Consciousness
Thoughts Of ConsciousnessThoughts Of Consciousness
Thoughts Of Consciousness
 
shared_ptr & weak_ptr (ppt 初版, DL 専用)
shared_ptr & weak_ptr (ppt 初版, DL 専用)shared_ptr & weak_ptr (ppt 初版, DL 専用)
shared_ptr & weak_ptr (ppt 初版, DL 専用)
 
Job Tumber, Llc – Partner Opportunity
Job Tumber, Llc – Partner OpportunityJob Tumber, Llc – Partner Opportunity
Job Tumber, Llc – Partner Opportunity
 

Destructive Call