2012-02-03 26 views
7

可能性の重複:私はちょうど好奇心
std::string and its automatic memory resizingC++の文字列はどのように格納されていますか?

は、どのように文字列がメモリに保存されますか?たとえば、私がこれを行うとき:

string testString = "asd"; 

それは4バイトを割り当てます、そうですか? a + s + d + \0

しかし、後でこの文字列に新しいテキストを割り当てる場合は機能しますが、どういう仕組みがわかりません。たとえば、私はこれを行う:

testString = "123456789" 

これで10バイトの長さにする必要があります。しかし、そのような文字列のためのスペースがない場合はどうなりますか?文字列の先頭から5番目と6番目のバイトが他の2文字で取られているとしましょう。 CPUはそれをどのように処理しますか?それは、その文字列が適合するメモリ内の全く新しい位置を見つけますか?

+0

正確な重複ではないかもしれないが、元の質問は、メモリが文字列によって動的に割り当てられていることをすでに知っていましたが、ここではわかりません。とにかく私は再開に投票しません。 –

答えて

12

これは実装に依存しますが、文字列クラスに実際の文字列の内容が格納されるメモリ領域へのポインタが含まれるという一般的な考え方です。 2つの一般的な実装は、3つのポインタ(割り当てられた領域とデータの先頭、データの終わり、割り当てられた領域の終わり)またはポインタ(割り当てられた領域とデータの先頭)と2つの整数(文字列中の文字数と割り当てられた数バイト)。

新しいデータが文字列に追加されると、割り当てられた領域に収まる場合、それが書き込まれ、データポインタのサイズ/終了がそれに応じて更新されます。データが領域に収まらない場合、新しいバッファが作成され、データがコピーされます。

また、多くの実装では、文字列クラスに小さなバッファが含まれている小さな文字列に対して最適化が行われていることにも注意してください。文字列の内容がバッファに収まる場合、メモリは動的に割り当てられず、ローカルバッファのみが使用されます。

+1

よく3つのポインタが24ですバイト(64ビットアーチ)。バッファーとしてのスペースを使用してポインタを上書きするだけであれば、合理的なサイズの文字列です。 –

+0

ありがとう、私は今それを得ると思う – user1145902

+1

@ LokiAstari:あなたがバッファーとして使用されるかどうかを識別するために余分なフラグをどこかに追加する必要があります。しかし、小さなバッファー最適化のためにポインターを再利用することは安価であるという公平な仮定です。 –

2

は、一部のメモリ位置だけでなくオブジェクトです。必要に応じて動的にメモリを割り当てます。

=演算子がオーバーロードされています。あなたがtestString = "123456789";と言うときは、メソッドが呼び出され、const char *を受け取りました。

+0

私が間違っていないと、 'std :: string'はオブジェクトではありません。 – jrok

+0

文字列内のcharsはバイト単位で(通常の配列のように)メモリ内で順序付けする必要はありませんが、ランダムな場所に格納することはできますか? – user1145902

+3

@jrok:実際には 'std :: string'がオブジェクトがインスタンス化される型(インスタンス化)であることを意味しない限り、間違っているようです... –

2

サイズが格納されています。新しい文字列を格納すると、オプションで既存のメモリの割り当てを解除し、サイズの変更に対処するために新しいメモリを割り当てます。

最初に4バイトの文字列を割り当てたときに必ずしも4バイトを割り当てる必要はありません。それはそれよりも多くのスペースを割り当てるかもしれません(それはより少なく割り当てません)。

3

stringは、char *のような単純なデータ型ではありません。 クラスです。実装の詳細は必ずしも表示されません。

特に、stringには、実際の大きさを把握するためのカウンタが含まれています。

char[] test = "asd";  // allocates exactly 4 bytes 
string testString = "asd"; // who knows? 

testString = "longer";  // allocates more if necessary 

提案:簡単なプログラムを書いて、デバッガを使用して、それをステップ。 stringを調べて、値が変更されたときにプライベートメンバーがどのように変化するかを見てください。

+0

ありがとうございます。 – user1145902

関連する問題