我有一个简单的问题。我想知道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");
答案 0 :(得分:21)
tst_first_string
和tst_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
加上一个标志,表示这就是它所代表的内容。当你写它时,它必须分配内存。