wstring null是否终止?

Jon*_*len 8 c++

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

Rap*_*ptz 13

它是否包括长度

是.它是C++ 11标准所要求的.

§21.4.4

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

但请注意,这不知道unicode.


它是否为空终止

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

§21.4.7.1

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

  • @JonathanAllen我不会从标准中学习,它充满了标准,所以很难阅读.但是,你可以找到C++ 14 CD [这里](http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2013/n3690.pdf),以及多个草稿和标准化进程. (2认同)
  • @JonathanAllen如果你想要一个好的人类可读的文档我绝对支持[这一个](http://en.cppreference.com/w/Main_Page) (2认同)

小智 10

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


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

size_t length()
{
    return m_length;
}

const wchar_t *c_str()
{
    return m_cstr;
}
Run Code Online (Sandbox Code Playgroud)

如果它没有存储明确的长度,则size()必须将字符计数到NULin O(n),如果你可以避免它,这是浪费的.

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

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

  • 它[保证在c ++ 11中以空值终止](http://stackoverflow.com/questions/6077189/will-stdstring-always-be-null-terminated-in-c11). (4认同)