什么时候std :: string分配在初始化时发生

时间:2015-09-21 12:40:11

标签: c++ visual-studio

当我在类中创建std::string成员变量时,在实例化时是否已经分配了默认内存?或std::string推迟分配直到实际使用?

我现在正在使用Visual Studio 2010,当我创建一个空字符串时,我注意到了:

  std::string s0;
  std::string s1 = "";

两者都有容量== 15设置。那么这是否意味着它已经分配了15个字节的内存?如果是,我可以阻止这种情况,以便不分配内存吗?

这是不同编译器特定的实现吗?

4 个答案:

答案 0 :(得分:4)

标准未指定空std::string的初始容量,并且取决于实现。

许多实现将分配大约16个左右字符的初始容量(是的,容量是指分配的内存)。

答案 1 :(得分:2)

我无法访问VS2010,但在VS2012中尝试了这一点,并且我看到了您描述的完全相同的行为(容量15,正在分配一些内存)

正在发生的事情(特别是在这种情况下)是Small String Optimization为您提供了15个容量。没有为此分配内存。

但是,MS的C ++标准库还有额外的调试检查,有时必须在结构中存储其他信息,以便它们可以在运行时运行额外的检查,例如迭代器验证。您正在看到其中一个"代理"正在创建的对象。在最近版本的VS中,只需在默认的Release Build中运行即可关闭这些检查。但是,如果内存服务,在较旧版本的Visual Studio中关闭它会更加痛苦 - 请参阅_ITERATOR_DEBUG_LEVEL error in visual studio以及其他相关的答案,了解如何关闭它们。您可能只需要发布'发布'建立于2010年,您可能需要随意使用&_ 39ERATOR_DEBUG_LEVEL' _ITERATOR_DEBUG_LEVEL'和' _SECURE_SCL'定义

答案 2 :(得分:1)

注意:此答案有误,但stackoverflow不接受删除已接受的答案。

原始答案:

您在实践中看到的是SSO(小字符串优化)。它确实是特定于实现的。

有关详细信息,请参阅this answer

答案 3 :(得分:0)

编译器决定必须为字符串初始化多少内存。不同的编译器将分配不同数量的内存将是常用句子。