当我在类中创建std::string
成员变量时,在实例化时是否已经分配了默认内存?或std::string
推迟分配直到实际使用?
我现在正在使用Visual Studio 2010,当我创建一个空字符串时,我注意到了:
std::string s0;
std::string s1 = "";
两者都有容量== 15设置。那么这是否意味着它已经分配了15个字节的内存?如果是,我可以阻止这种情况,以便不分配内存吗?
这是不同编译器特定的实现吗?
答案 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)
答案 3 :(得分:0)
编译器决定必须为字符串初始化多少内存。不同的编译器将分配不同数量的内存将是常用句子。