在阅读What's the rationale for null terminated strings?和一些类似的问题之后,我发现在C#/。内部,Net字符串都是长度前缀的,并且在BSTR Data Type中都是空终止的。
字符串长度前缀和空终止的原因是什么,而不是例如。只有长度前缀?
答案 0 :(得分:21)
长度前缀,以便计算长度为O(1)
。
Null终止,以便对非托管超快速进行编组(非托管可能需要以空字符结尾的字符串)。
答案 1 :(得分:13)
以下摘录自Jon Skeet关于字符串的博客Post:
尽管字符串在API方面不是以空值终止的,但字符数组是以空值终止的,因为这意味着它可以直接传递给非托管函数而不涉及任何复制,假设操作间指定该字符串应该编组为Unicode。
答案 2 :(得分:4)
最有可能的是,确保与COM的轻松互操作性。
答案 3 :(得分:3)
虽然length字段使框架可以很容易地确定字符串的长度(并且它允许字符串包含零值的字符),但框架(或用户程序)需要处理的内容非常多期望NULL终止字符串。
例如,与Win32 API类似。
因此,在字符串数据的末尾保持一个NULL终止符是很方便的,因为它可能需要经常出现在那里。
请注意,C ++的std::string
类以相同的方式实现(无论如何在MSVC中)。出于同样的原因,我确信(c_str()
经常被用来将std::string
传递给想要C风格字符串的东西。
答案 4 :(得分:0)
最好的猜测是,与遍历它相比,找到长度是常数(O(1)),在O(n)中运行。