【发布时间】:2011-11-05 10:02:06
【问题描述】:
【问题讨论】:
-
但
std::string不要求空终止
标签: c++
【问题讨论】:
std::string 不要求空终止
标签: c++
C 和 C++ 中的传统字符串使用空终止符来指示字符串的结尾。由于字符串指针只是指向一个字符数组,没有任何长度或其他元数据,因此空终止符是确定字符串长度的唯一方法。
至于为什么这样做,这是一个更难回答的问题。存储字符串数据的方式有很多种,这只是其中一种。
【讨论】:
有两种存储原始字符串的基本技术,一种将长度存储在标题中,另一种使用零终止符作为结尾。
C 语言的设计者选择后者。这就是为什么。 C++ 只是继承了这个,std::string 使用了这种技术,所以c_str() 是 O(1)。注意:我不知道标准是否需要这个,甚至不在乎。
【讨论】:
字符串可以被认为是一个可变长度的字段。将计数保存在某处需要某种格式,例如首先存储长度,然后存储字符串(如 ID3v2 标签中的帧头)。保留终止符来标记可变长度字段的结尾是另一种方法。 C 已经选择这种方式来标记字符串字段的终止。取决于我们如何解释位和字节的序列。
【讨论】:
不是官方答案,但我可以推测 C(以及后来的 C++)字符串以零结尾的原因是因为如果加载到内存中的值为零(空终止符),它只需要一条机器指令即可分支。那,它只有一个字节,而不是限制为 255 个字符而不添加另一个字节的 Pascal 字符串。
【讨论】: