4

std::string が gcc に実装されている方法を調べていたときに、sizeof(std::string) がポインターのサイズ (x32 ビルドでは 4 バイト、x64 では 8 バイト) と正確に等しいことに気付きました。文字列は文字列バッファーへのポインターとその長さを最低限保持する必要があるため、GCC の std::string オブジェクトは実際には、このデータを保持する内部構造へのポインターであると思いました。

結果として、新しい文字列が作成されると、1 つの動的メモリ割り当てが発生する必要があります (文字列が空の場合でも)。

これは、パフォーマンスのオーバーヘッドに加えて、メモリのオーバーヘッドも引き起こします (これは、非常に小さなメモリのチャンクを割り当てている場合に発生します)。

だから私はそのようなデザインの欠点しか見ません。私は何が欠けていますか?そもそもそのような実装の利点と理由は何ですか?

4

1 に答える 1

5

の上部にある長いコメントを読んでください。<bits/basic_string.h>ポインターが何を指すか、文字列の長さ (および参照カウント) が格納される場所、およびそのようにする理由が説明されています。

ただし、C++11 では参照カウントのコピーオンライトが許可されていないstd::stringため、GCC の実装を変更する必要がありますが、そうすると ABI が壊れてしまうため、ABI の変更が避けられなくなるまで延期されています。ABI を変更したくない場合は、数か月後にもう一度変更する必要があります。ユーザーの煩わしさを最小限に抑えるために、変更する場合は一度だけ変更する必要があります。

于 2012-05-29T00:38:08.600 に答える