簡単な質問があります。 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");
tst_first_string
とtst_second_string
は、const char*
へのコンストラクタを使用して構築されます。文字数before nul-terminatorはどちらの場合も同じであるため、構造はまったく同じになるとimagineします。そうは言っても、C++標準はメモリ管理に関して何をしなければならないかについて意図的にあいまいであるため、確実に知ることはできません。
また、多くのstd::string
の実装では、小さな文字列に対してshort string optimization手法を利用しているため、オブジェクト全体が自動ストレージ期間でメモリに書き込まれます。あなたの場合、動的メモリがまったく使用されていない可能性があります。
C++ 11以降では、std::string
のコピーオンライトセマンティクスが許可されなくなったため、2つの異なる文字列willが作成されることがわかっています。
文字列の実装と長さに依存します。
ほとんどの主要な実装には短い文字列の最適化(SSO)があり、文字列は文字列オブジェクト自体に格納されます。
これは実装定義ですが、例として、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
_が使用されていることがわかります。
言うまでもないことですが、標準ライブラリのこの特定の実装以外では、これが当てはまるとは限りません。これは、いつでも変更される可能性のある内部の詳細です。