任意の大きなオブジェクトを保持するには、boost::any
/std::any
は必ずオブジェクトのヒープスペースを割り当てる必要があります。ただし、サイズがポインタ(int,char,bool,...
)以下の小さな型の場合は、代わりにany
がその値をポインタスロットまたは他のインプレースメモリにインプレースで格納し、ヒープ領域を割り当てないことがあります。しかし、実装はこれを行うのですか?boost :: any/std :: anyは小さなオブジェクトをインプレースに格納しますか?
私はしばしばany
に小さなタイプを格納し、string
のようなより大きなタイプしか保存しないシナリオがあります。コードはかなり暑いので、私は質問しています。最適化が行われない場合は、小さな型をインプレースに格納する独自の実装を使用する方がよい場合があります。
「のコードの一部となりますので、小さなテンプレート作るの実装コストがありますとても暑い"?それがうまくいっていないということですか?プロファイリングしましたか/最適化でコンパイルしていますか?私は、この余分なメモリアクセスがあなたのゲームのチェンジャーになるのではないかと疑っています。 – mascoj
['libC++' trunk](https://github.com/llvm-mirror/libcxx/blob/master/include/any)には[small object](https://github.com/llvm-mirror/libcxx/)があります。 blob/master/include/any#L132) 'std :: any'の最適化を行います。私はそれが合理的なSTL実装のために同じでなければならないと思う... – WhiZTiM
@mascoj "ホットコード"は、残りの部分よりもかなり頻繁に実行されるコード部分であり、したがってボトルネックになる傾向があります。 – Quentin