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

Osc*_*car 22 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");
Run Code Online (Sandbox Code Playgroud)

Bat*_*eba 21

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

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

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

  • 它还取决于分配器.可以使用基于堆栈的分配器,因此在这种情况下无论如何都不会涉及堆. (3认同)

小智 12

它取决于字符串的实现和长度.

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