std :: string总是需要堆内存吗?

时间:2016-10-06 12:43:42

标签: c++ memory stdstring

我有一个简单的问题。我想知道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");

4 个答案:

答案 0 :(得分:21)

tst_first_stringtst_second_string都将使用const char*的构造函数构建。由于在之前 nul-terminator中的字符数在两种情况下都是相同的,因此您想象构造将完全相同。这就是说C ++标准对于内存管理必须发生的事情是故意模糊的,所以你不会绝对肯定地知道。

另请注意,许多std::string实现利用短字符串优化技术处理小字符串,这会导致整个对象以自动存储持续时间写入内存。在您的情况下,可能根本不使用动态内存。

我们确实知道的是,从C ++ 11开始,不再允许复制std::string的写入语义,因此将创建两个不同的字符串

答案 1 :(得分:12)

这取决于字符串的实现和长度。

大多数主要实现都有短字符串优化(SSO),其中字符串存储在字符串对象本身中。

答案 2 :(得分:2)

这是实现定义的,但作为示例,如果字符串的长度小于16个字节,则Visual C ++ 2015 Update 3上的std::basic_string实现将使用内部数组。这是来自_String_val的{​​{1}}的经过大量编辑的部分:

<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

毋庸置疑,除了标准库的特定实现之外,您不应该依赖于此。这是一个可能随时改变的内部细节。

答案 3 :(得分:-4)

字符串文字是只读的。因此,可能的优化是当 <setProperty id="_setProperty1" propertyName="DateStart"> <groovy>new java.text.SimpleDateFormat('yyyy-MM-dd').format(request.body.getStartDate())</groovy> </setProperty> 指向文字时,它仅包含std::string加上一个标志,表示这就是它所代表的内容。当你写它时,它必须分配内存。