私は自分のコード全体で std::string オブジェクトを使用しており、それらのほとんどはスタックに割り当てられています。デフォルトの new/delete 演算子を置き換えて平均メモリ割り当てサイズをチェックしたところ、ほとんどの割り当てが std::string から来ていることに驚きました。これは非常に重要です。それらは 12 から 32 バイトです! これ(空きストレージから割り当てられた多数の小さな文字列)を最適化するために、私は簡単な解決策を思いつきました:
- カスタム文字列クラスを実装する
- 64 バイトなどの固定サイズの定義済みバッファを追加します (プロファイリング後にこのサイズを調整できます)。
- 文字列の長さが 64 バイト未満の場合は定義済みのバッファを使用するか、より大きな文字列の場合は空きストレージから新しいバッファを割り当てます。
この実装では、長さ > 64 のすべての文字列に 64 バイトのメモリ オーバーヘッドを追加し、64 バイト未満の文字列には (64-lenth) オーバーヘッドも追加しますが、小さな文字列のすべての割り当てを防ぎます。
あなたはそのようなアプローチを試みましたか?割り当て時間/メモリの断片化を節約するために、ほとんどの場合、このメモリ オーバーヘッドをスタックに追加することは合理的ですか?
このアプローチは、カスタム str::string アロケーターよりも優れていますか?