Tag: 空终止

什么是空string的基本原理?

就像我喜欢C和C ++一样,我忍不住用零结尾的string来select我的头: 在C之前存在长度前缀(即Pascal)string 通过允许恒定的时间长度查找,长度前缀string使得几个algorithm更快。 带有前缀长度的string使得导致缓冲区溢出错误变得更加困难。 即使在32位机器上,如果允许string为可用内存的大小,则长度前缀string比空string只有三个字节。 在16位机器上,这是一个字节。 在64位机器上,4GB是一个合理的string长度限制,但即使您想将其扩展到机器字的大小,64位机器通常也有充足的内存,使得额外的七个字节sorting为空参数。 我知道最初的C标准是为疯狂的穷人机器(内存)编写的,但效率的论点在这里并不卖我。 几乎所有其他语言(即Perl,Pascal,Python,Java,C#等)都使用长度前缀string。 这些语言通常在string处理基准testing中胜过C,因为它们对string更高效。 C ++用std::basic_string模板纠正了这个问题,但是普通的字符数组需要null结尾的string仍然普遍。 这也是不完善的,因为它需要堆分配。 空终止的string必须保留一个不能存在于string中的字符(即null),而长度前缀string可以包含embedded的空值。 这些事情中有几个比C更早出现,所以C不知道它们是有意义的。 然而,在C成立之前,有好几个都很清楚。 为什么会selectnull终止的string,而不是明显优越的长度前缀? 编辑 :因为有些人在我的效率点上面提出了一些事实 (而且不喜欢那些我已经提供的),他们来自于一些事情: 使用空string的Concat需要O(n + m)时间复杂度。 长度前缀通常只需要O(m)。 使用空字符结束的string的长度需要O(n)时间复杂度。 长度前缀是O(1)。 长度和concat是迄今为止最常见的string操作。 有几种情况,以空字符结束的string可以更有效,但是这种情况发生得less得多。 从下面的答案,这些是一些情况下,空string更有效: 当你需要中断一个string的开始,并且需要将它传递给某种方法。 即使允许销毁原始string,也不能在长度为前缀的情况下实时执行此操作,因为长度前缀可能需要遵循alignment规则。 在某些情况下,你只是逐个字符地循环,你可能会保存一个CPU寄存器。 请注意,这只适用于你没有dynamic分配string的情况(因为那么你必须释放它,因此必须使用你保存的CPU寄存器来保存你最初从malloc和朋友那里得到的指针)。 以上都不是长度和连续的一样普遍。 下面的答案还有一个说法: 你需要切断string的结尾 但是这个是不正确的 – 对于以空字符结尾和长度为前缀的string,这是相同的时间量。 (空终止的string只是在你想要新结束的地方贴上一个null,长度前缀只是从前缀中减去)。