【发布时间】:2015-07-18 15:06:17
【问题描述】:
使用std::string::reserve 进行预分配时,我是否必须为终止0 显式添加一个,以避免重新分配和后续复制?
例如,知道长度为5的字符串"Hello"将存储在std::string str中,我是否必须调用str.reserve(6)?
如果我正确阅读了标准,那么我认为答案应该是是的。对于reserve 它说
reserve()之后,capability()大于等于reserve的参数。
对于capacity,它依次声明
返回:字符串中分配的存储大小。
不过,我不熟悉标准中公式的微妙之处,我想证实我的怀疑。
【问题讨论】:
-
在 C++ 11 中,零的空间是隐含的。在 C++ pre-11 中,这取决于实现。
-
要清楚,这是一个是的,在字符串长度上加一个来保持? (在 C++11 中,我的意思是,谁在乎 pre-11 ;)
-
不,它是“不,如果您调用
c_str(),std::string 实现将自动保留一个 [或多个] 额外字节来保存零字节以指示字符串的结尾” .当然,如果您在 pre-11 中不调用c_str(),则无法保证字符串末尾有一个零 - 或者在这种情况下该空格不用于其他用途。但是对于 C++11,您可以保证零有空间,并且实际内容之后的字符是零。 (但请注意,这不是字符串的一部分,不会计入容量) -
@Mats Petersson:很有趣,尤其是 11 年前的 c_str 故事。这里的措辞有点令人困惑,因为当 0 不算数时,我希望标准会在 'reserve() 之后写出容量() 严格 大于 Reserve 的参数。 '顺便说一句,背景是,从 VC2013 与 C++11 的时序来看,我的印象是加 1 确实加快了速度。但也许我必须更深入地研究 MS 的字符串实现(那么在这方面可能不符合要求?)。
-
@Mats Petersson:好的,如果我正确理解您在下面的评论,那么 0 不计入“字符串中分配的存储空间”,对吧?这再次令人困惑,但我想事情就是这样 :) 感谢您的澄清!
标签: c++ dynamic-memory-allocation stdstring