int main(void)
{
std::string foo("foo");
}
私の理解では、上記のコードはデフォルトのアロケータを使用してnewを呼び出します。したがって、std :: string fooがスタックに割り当てられていても、foo内の内部バッファーはヒープに割り当てられます。
スタックに完全に割り当てられる文字列を作成するにはどうすればよいですか?
int main(void)
{
std::string foo("foo");
}
私の理解では、上記のコードはデフォルトのアロケータを使用してnewを呼び出します。したがって、std :: string fooがスタックに割り当てられていても、foo内の内部バッファーはヒープに割り当てられます。
スタックに完全に割り当てられる文字列を作成するにはどうすればよいですか?
私は最近これを自分でやりたいと思っていましたが、次のコードが明らかになりました。
std::allocator
これは、 STL コンテナーのストレージの初期割り当てにスタックベースの割り当てを提供できるnew を定義します。特定の問題を解決する別の方法を見つけたので、実際にコードを自分で使用しませんでしたが、おそらく役立つでしょう。使用法と注意事項に関するコード内のコメントを必ずお読みください。
これを行うことの有用性と妥当性に疑問を持っている人は、次のことを考慮してください。
一部の人々は、スタックベースの割り当てを使用する文字列はstd::string
、あたかもこれが何らかの形でその有用性を損なうかのようにではないとコメントしています。確かに、この 2 つを同じ意味で使用することはできませstackstring
んstd::string
。しかし(正しく行えば)、 、 などで現在使用しているのと同じすべてのメンバー関数を で使用でき、引き続き 正常にstackstring
動作するため、多くの を使用できます。 STL アルゴリズム。確かに、これは厳密な意味ではありませんが、実用的な意味では「文字列」であり、非常に便利です。std::string
find_first_of()
append()
begin()
end()
std::string
問題はstd::basic_string
、アロケータのテンプレート パラメータがあることです。ただしstd::string
、テンプレートではなく、パラメーターはありません。
したがって、原則std::basic_string
として、スタック上のメモリを使用するアロケータで のインスタンス化を使用できますが、std::string
. 特に、ランタイム ポリモーフィズムが得られず、結果のオブジェクトをstd::string
.
できません。を除外する...
std::string
のインスタンス化です
std::basic_string<class CharType,
class Traits=char_traits<CharType>,
class Allocator=allocator<CharType> >
おそらく、メモリ管理にallocaを使用する Allocator クラスを定義できます。これは、Allocator 自体と、basic_string
それを直接または間接的に呼び出すメソッドが all である場合にのみ機能しますinline
。basic_string
このアロケータで作成されたオブジェクトは ではありませんが、std::string
(ほとんど) そのように動作します。ただし、これは限られた利益のためのかなりの量の作業になります。具体的には、このクラスを使用して関数から値を返すことは、キャリアを制限する動きになります。
なぜあなたや他の誰かがこれをしたいのか分かりません。
そんなことをするのは難しいのではないかと思いますが、なぜやりたいのかしら?スタックに完全に何かを割り当てるには、コンパイラはコンパイル時にその正確なサイズを知る必要があります。この例では、std::string
メタデータのサイズだけでなく、文字列データ自体のサイズも知る必要があります。 。これはあまり柔軟ではありません。含める文字列データのサイズに応じて、おそらく異なる文字列タイプが必要になります。不可能ではなく、少し複雑になる傾向があります。