web-dev-qa-db-ja.com

std :: stringは常にヒープメモリを必要としますか?

簡単な質問があります。 std::stringがC++で毎回メモリを割り当てるかどうかを知りたいです。

私のコードでは、コンストラクターがtst_first_stringを構築するためにtst_second_stringよりも多くのメモリを使用するようです。

 char* first_string = new char[5];
 strcpy(first_string, "test");
 std::string tst_first_string(first_string);
 std::string tst_second_string("test");
22
Oscar

tst_first_stringtst_second_stringは、const char*へのコンストラクタを使用して構築されます。文字数before nul-terminatorはどちらの場合も同じであるため、構造はまったく同じになるとimagineします。そうは言っても、C++標準はメモリ管理に関して何をしなければならないかについて意図的にあいまいであるため、確実に知ることはできません。

また、多くのstd::stringの実装では、小さな文字列に対してshort string optimization手法を利用しているため、オブジェクト全体が自動ストレージ期間でメモリに書き込まれます。あなたの場合、動的メモリがまったく使用されていない可能性があります。

C++ 11以降では、std::stringのコピーオンライトセマンティクスが許可されなくなったため、2つの異なる文字列willが作成されることがわかっています。

21
Bathsheba

文字列の実装と長さに依存します。

ほとんどの主要な実装には短い文字列の最適化(SSO)があり、文字列は文字列オブジェクト自体に格納されます。

12
Kent

これは実装定義ですが、例として、Visual C++ 2015 Update 3の_std::basic_string_実装は、文字列の長さが16バイト未満の場合に内部配列を使用します。 __String_val_の_<xstring>_の大幅に編集された部分を次に示します。

_template<class _Val_types>
class _String_val
{
public:
    typedef typename _Val_types::value_type value_type;

    enum
    {   // length of internal buffer, [1, 16]
        _BUF_SIZE = 16 / sizeof (value_type) < 1 ? 1
            : 16 / sizeof (value_type)
    };

    value_type *_Myptr()
    {   // determine current pointer to buffer for mutable string
        return (this->_BUF_SIZE <= _Myres
            ? _Bx._Ptr
            : _Bx._Buf);
    }

    union _Bxty
    {   // storage for small buffer or pointer to larger one
        value_type _Buf[_BUF_SIZE];
        pointer _Ptr;
    } _Bx;
};
_

_Myptr()を見ると、長さが__Buf_未満の場合は__BUF_SIZE_が使用され、それ以外の場合は__Ptr_が使用されていることがわかります。

言うまでもないことですが、標準ライブラリのこの特定の実装以外では、これが当てはまるとは限りません。これは、いつでも変更される可能性のある内部の詳細です。

2
isanae