次のように、boost::variantを使用してdoubleまたはstringを格納するクラスがあります。
class value
{
boost::variant<double, std::string> val;
};
これは、私が遊んでいるおもちゃのインタプリタにとっては不変の値型であると考えられています。最初は、const参照で渡し、値で返すことをお勧めします。プリミティブとして扱いたいので、常にスタックに割り当てます。しかし、サイズが40バイトであることがわかり(ほとんどの場合、sizeof std :: stringが原因です)、少し心配でした。スタックに大きなメモリチャンクを割り当てるべきではないことはわかっていますが、大きすぎるのはどれくらいですか?
また、戻るたびに40バイトをコピーすることは、特に値が不変であり、コピーする必要さえないため、少し無駄に思えます。
オプションの通常のヒープ割り当ては、1秒あたり数千のこれらの割り当て/割り当て解除を行うことができるため、あまり魅力的ではないようです。
私が思いついた最後のオプションは、必要に応じてこれらのオブジェクトを割り当てるためにboost :: poolを用意し、それらの存続期間を管理するためにboost::shared_ptrを使用することです。ただし、インタプリタがメモリ割り当てを担当するため(メモリ割り当てのタイプは、テンプレート引数としてインタプリタに渡されるポリシーになります)、これは、値クラスがインタプリタについて知る必要があることを意味し、少し複雑になります。 。
だからこれらは質問です:
- この場合、どうすればよいですか、またその理由は何ですか?
- スタックに割り当てるには「大きすぎる」の大きさはどれくらいですか?それは、割り当てられる頻度とコピーする必要がある頻度にもよると思います。
ありがとう。