阅读空终止字符串的基本原理是什么?以及一些类似的问题,我发现在 C#/.Net 中,字符串在内部都是以长度为前缀和以空结尾的,就像在BSTR Data Type中一样。
字符串既是长度前缀又是空终止的原因是什么,而不是例如。只有长度前缀?
阅读空终止字符串的基本原理是什么?以及一些类似的问题,我发现在 C#/.Net 中,字符串在内部都是以长度为前缀和以空结尾的,就像在BSTR Data Type中一样。
字符串既是长度前缀又是空终止的原因是什么,而不是例如。只有长度前缀?
长度前缀,以便计算长度为O(1)
。
Null 终止以使编组到非托管的极快(非托管可能需要以空结尾的字符串)。
这是 Jon Skeet 的关于字符串的博客文章的摘录:
尽管就 API 而言字符串不是以空值结尾的,但字符数组是以空值结尾的,因为这意味着它可以直接传递给非托管函数而无需涉及任何复制,假设互操作指定字符串应编组为 Unicode。
很可能是为了确保与 COM 的轻松互操作性。
虽然长度字段使框架可以轻松确定字符串的长度(并且它允许字符串包含具有零值的字符),但框架(或用户程序)需要处理大量的东西期望以 NULL 结尾的字符串。
例如,像 Win32 API。
因此,在字符串数据的末尾保留一个 NULL 终止符很方便,因为无论如何它可能需要经常出现。
请注意,C++ 的std::string
类以相同的方式实现(无论如何在 MSVC 中)。出于同样的原因,我敢肯定 (c_str()
通常用于将 a 传递给std::string
需要 C 风格字符串的东西)。
最好的猜测是,与遍历它相比,找到长度是恒定的 (O(1)),运行时间为 O(n)。