是否使用NULL终止字符串(SZ)或长度前缀字符串(LPS)似乎是热键按钮主题。实际上,我们甚至有question on that topic here。
我发生了什么事。我们可以使用两者吗?我的意思是,显然,你不能制作LPS& SZ(LPSZ?)字符串没有删除一些关于其中一些的好东西。
然而,由于字符串长度测量需要很长时间,因此对SZ的最大抱怨似乎是操作所需的时间。我对此有一个想法:
使所有字符串SZ。但是,我们还可以将字符串mod 256(即:len % 256
)的长度存储在字符串之前的单个字节中。虽然它不会降低操作的复杂性,但它可能会以一个额外的字节为代价来大幅提高速度。
这个方案的主要优点是:
len
中没有浪费的字节)这就是strlen ()
在这个方案下的样子(显然,你会把它命名为别的,因为你会创建一个不同的库):
size_t ppsz_strlen (const char *s) {
// get LPS
size_t = ((uint8_t *) s)[-1];
// check for SZ across every 256 byte interval
for (x = x; s[x]; x += 256)
continue;
return x;
}
合适的名称可能是PPSZ(部分带前缀的Null Terminated Strings)。
对我而言,这似乎是一个合理的权衡:一个字节用于相当大的加速度。当然,有人可能会问:为什么不是两个,四个或八个字节?我的答案是,程序中的大多数字符串都不会变得太大,而前面跳过65536,16777216,2 ** 32
或2 ** 64
变得非常有价值。在其中一些情况下,实际上可能是考虑拆分字符串的好时机。特别是如果一个字符串溢出超出64位寻址空间的大小。
无论如何,我想知道是否有其他人对这个概念有一些想法。我很肯定有可能我错过了为什么我之前没有在实践中看到这个概念。
感谢您找到任何建议或问题!