2017-01-26 28 views
13

任意の大きなオブジェクトを保持するには、boost::any/std::anyは必ずオブジェクトのヒープスペースを割り当てる必要があります。ただし、サイズがポインタ(int,char,bool,...)以下の小さな型の場合は、代わりにanyがその値をポインタスロットまたは他のインプレースメモリにインプレースで格納し、ヒープ領域を割り当てないことがあります。しかし、実装はこれを行うのですか?boost :: any/std :: anyは小さなオブジェクトをインプレースに格納しますか?

私はしばしばanyに小さなタイプを格納し、stringのようなより大きなタイプしか保存しないシナリオがあります。コードはかなり暑いので、私は質問しています。最適化が行われない場合は、小さな型をインプレースに格納する独自の実装を使用する方がよい場合があります。

+1

「のコードの一部となりますので、小さなテンプレート作るの実装コストがありますとても暑い"?それがうまくいっていないということですか?プロファイリングしましたか/最適化でコンパイルしていますか?私は、この余分なメモリアクセスがあなたのゲームのチェンジャーになるのではないかと疑っています。 – mascoj

+0

['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

+0

@mascoj "ホットコード"は、残りの部分よりもかなり頻繁に実行されるコード部分であり、したがってボトルネックになる傾向があります。 – Quentin

答えて

11

実装は小さな含まれているオブジェクトの動的に割り当てられたメモリの使用を避けるべきであると[any.class]で保証が、C++ 17のドラフト状態はありません。 [例:構築されたオブジェクトがintだけを保持している場合。 - end example]このような小物の最適化は、のis_­nothrow_­move_­constructible_­v<T>にのみ適用され、trueです。

残念ながら、それは、intが所定の位置に格納することができなければならないと言うことを除いて小さな考慮されるべきである何のための勧告を与えるものではありません。

+2

最大サイズがテンプレートパラメータとして指定できていればいいでしょうか(デフォルト値は現在の値どおり) –

+0

@ViktorSehrこれはすばらしいでしょう。 – NathanOliver

+5

@NathanOliver実際にはありません。 'any 'が 'any <42> 'と異なるタイプの' any'の拡散を持つことは、そのような語彙タイプを持つ目的の半分を打ち負かします。 –

5

私がBoost.Anyのソースコードを正しく理解しており、デバッガでそれを突き止めた場合、小さなオブジェクトの最適化は適用されません。 (新規の無条件の使用に注意してください。)

template<typename ValueType> 
    any(const ValueType & value) 
     : content(new holder< 
      BOOST_DEDUCED_TYPENAME remove_cv<BOOST_DEDUCED_TYPENAME decay<const ValueType>::type>::type 
     >(value)) 
    { 
    } 
2

ネイサンオリバーさんとジョシュのケリーの答えが正しい:保証はありません、ブーストが小さな値の最適化を使用しません。 https://gcc.gnu.org/viewcvs/gcc/trunk/libstdc%2B%2B-v3/include/experimental/any?view=markup#l106

:より実用的な例で

https://github.com/llvm-mirror/libcxx/blob/master/include/experimental/any#L129 は(彼らは8バイト幅であれば24バイト)(打ち鳴らすのは)あなたのスペースの価値は3つの空ポインタを与えるのlibC++

のlibstdC++一つだけのポインタを紹介します

anyを変更してテンプレートパラメータを作成するのは難しくありません。異なるサイズのanyの間に互換性があることを確認してください。

IMO、パフォーマンスの違いは、私のベンチマークによると、割り当てられた小さなサイズの最適化とヒープの間でとても充実している、そしてそれそれは標準

+1

私はそれが少なくともC++ 17の標準ではなく、標準のテンプレートになるとは思わない。スタンダードはすでに機能が完備されています。 – gexicide

関連する問題