C++ ときどき ごはん、わりとてぃーぶれいく☆

Wonder Rabbit Projectのなかのひとのブログ。主にC++。

Boost-1.65 の PolyCollection, Stacktrace, Sync の概要を確認

Boost-1.65 から3つの新しいライブラリーが入るらしいので概要( Introduction )を確認したメモ。

  1. Chapter 28. Boost.PolyCollection - develop
  2. Chapter 38. Boost.Stacktrace 1.0 - develop
  3. http://www.boost.org/doc/libs/develop/libs/sync/index.html (公式のリンクURLなんだけど執筆現在リンク切れ・w・)

Boost.PolyCollection

抽象型を基にした派生クラスのインスタンスとしてのオブジェクト「群」に対して、基礎的なC++の実装では起こり得る次の2点の実行時のパフォーマンス問題:

  1. ヒープアロケーションによってメモリーが不連続化する事によるCPUキャッシュパフォーマンスの低下
  2. ポリモーフィックなオブジェクト「群」に対する仮想関数の操作に対する分岐予測失敗によるパフォーマンス低下

これらの影響を極力避けたい場合に有用なオブジェクト「群」を扱うコレクション型を用意したもの。以下の3種類が少なくとも Boost-1.65 時点から使用可能となる:

  1. boost::base_collection // 古典的な基底型と派生型によるオブジェクト指向プログラミング的なオブジェクト「群」向け
  2. boost::function_collection // std::function による関数のラッピングを用いたオブジェクト「群」向け
  3. boost::any_collection // Boost.TypeEreasure を用いたダッグタイピング的なオブジェクト「群」向け

ゲームとか物理シミュレーションとか書いてると役に立てやすいかもしれないなーと。 UE4 みたいなフレームワークを使っていてもユーザーコードレベルで明らかなボトルネック要因を局所的に Boost.PolyCollection で扱うように細工するとかでも十分に役立てられるのではないかな、と思う。そのうちパフォーマンスの変化を手元で計測してそこそこ効果ありそうなら使ってみようかな。

Boost.Stacktrace

C++の実行時に、関数の呼び出し順の状況や"今"呼ばれている関数は何か、あるいは例外の発生時にどこからその例外が飛ばされてきたのか、そんなような情報を人間にとって読み易く表示する機能を提供するシンプルな、C++03標準以降の規格で動作可能なライブラリー。

そういえば、 Boost.Stacktrace とは直接は関係無いのだけど、さいきん アイエエー 例外? なんで例外? - お前の血は何色だ!! 4 という事で id:rti7743 さんが “この例外を投げたのは誰だー” ってライブラリーを紹介していたなーと思い出すなど。

Boost.Sync

この記事の執筆現在、公式のドキュメントがリンク切れになっている上に、 Boost.Sync のぐぐらびりてぃー的な問題なのか情報がぱっとぐぐった程度ではあまり確かな事がでてきませんでした。

Boost の ML のアーカイブBoost mailing page: [boost] [thread] Dividing into Boost.Thread and Boost.Sync などから Boost-1.65 の Boost.Sync 推量するに、ライブラリーの名前は “同期処理” の意味の “Sync(-ronization)” で、これまで Boost の実装では Boost.SmartPtr, Boost.Log, Boost.Atomic などでそれぞれに実装されていた mutex ( spin_mutex, yield_spin_mutex ) を共通化するために新たに作ったライブラリー、といった具合になっているかもしれない。

私は Boost.Sync 周りの事情を詳しく追いかけていたわけではないし、↑のMLアーカイブもぱっとでてきたので掻い摘んで見ただけだし、実際に Boost-1.65 に取り込まれた(採択された)段階の Boost.Sync の話ではないのでこれについてはほとんど実際どうから疑わしい、くらいの概要確認に留まった。