【问题标题】:How does std::string keep track of NUL charstd::string 如何跟踪 NUL 字符
【发布时间】:2016-05-05 17:31:36
【问题描述】:

C++11 保证 std::string 在内部存储 nul 终止符。如果没有明确的terminate 方法,如何实现?

例子:

std::string foo("Baz");
printf("foo contains %s\n",&foo[0]); //Completely safe

【问题讨论】:

  • 不确定我是否理解这个问题。你能解释一下你的意思吗?例如,为什么需要 terminate 方法?
  • 通过在内部有一个指针,该指针指向一个至少包含 size() + 1 个字符的数组,并且可能以终止符作为最后一个字符。
  • 字符串构造函数复制字符串并添加空终止符。
  • 截断很容易,只需将终止符设置为新大小即可。追加,或者像std::vector一样重新分配,或者分配一些额外的内存开始,然后将新字符复制到终止符上,并将终止符设置为下一个字符。
  • @user877329:COW 在 C++11 中是非法的。 GCC 最终赶上了这一点。

标签: c++11 language-lawyer stdstring


【解决方案1】:

标准要求您从data() 获得的字符串以NUL 结尾,并且要求the references generated from operator[] are contiguous and NUL terminated。这就是规范的全部内容。

这是实现的工作。通常,只需在字符串末尾存储一个 NUL 终止符,使实际缓冲区大小比它看起来大一,就会发生这种情况。如果添加字符,它仍会在新附加到的字符序列的末尾存储一个 NUL 终止符。如果您删除字符,它会适当地移动 NUL 终止符。

这就是封装类型可以做的事情。他们可以建立和维护不变量。

【讨论】:

    猜你喜欢
    • 2019-07-17
    • 2021-06-29
    • 1970-01-01
    • 2023-03-06
    • 2016-03-29
    • 2019-03-31
    • 2017-06-06
    • 2010-10-28
    相关资源
    最近更新 更多