wstring null是否终止?

时间:2013-07-30 06:01:07

标签: c++

std :: wstring的内部结构是什么?它包括长度吗?是空终止了吗?既?

3 个答案:

答案 0 :(得分:12)

  

是否包含长度

是。这是C ++ 11标准所要求的。

§21.4.4

  

size_type size() const noexcept;
  1. 返回:当前字符串中类似char的对象数的计数   2. 复杂性:恒定时间。

但请注意,这不知道unicode。


  

是否终止

是。 C ++ 11标准还要求std::basic_string::c_str返回my_string[my_string.size()]有效范围的[0,size()]的有效指针,因此为空字符。

§21.4.7.1

  

const charT* c_str() const noexcept;
  const charT* data() const noexcept;
  1. 返回:指针p,表示p + i == &operator[](i)   i中的每个[0,size()]   2. 复杂性:恒定时间   3. 需要:程序不得更改任何值   存储在字符数组中。

答案 1 :(得分:10)

我们不知道。这完全取决于实施。 (至少直到C ++ 03 - 显然C ++ 11要求内部缓冲区以0结尾。)如果你使用的是开源,你可以查看C ++标准库实现的源代码。


除此之外,我发现它是合乎逻辑的,如果它是NUL终止它也存储了一个显式长度。这很好,因为它需要持续的时间来返回长度一个有效的C字符串:

size_t length()
{
    return m_length;
}

const wchar_t *c_str()
{
    return m_cstr;
}

如果它没有存储明确的长度,则size()必须将字符计算到NUL中的O(n),如果可以避免,则会浪费。< / p>

但是,如果内部缓冲区不是NUL终止的,但它只存储了长度,那么创建一个正确的NUL终止的C字符串将非常繁琐:字符串必须重新分配其存储并附加0(并且重新分配是一项昂贵的操作),或者它必须复制整个缓冲区,这也是O(n)操作。

(警告:无耻的自我推销 - 在我正在进行的C语言项目中,我采用了这种方法来实现灵活的字符串对象。)

答案 2 :(得分:0)

basic_string(wstring是typedef)不需要终止符。

是的,它管理自己的长度。

如果你需要一个以null结尾(又名C字符串)的string / wstring版本,请调用c_str()。但是它里面可以包含一个空字符,在这种情况下,几乎每个处理C字符串的C函数都无法看到整个字符串。