部分带前缀的Null终止字符串

时间:2014-09-30 08:27:40

标签: c string algorithm string-length null-terminated

是否使用NULL终止字符串(SZ)或长度前缀字符串(LPS)似乎是热键按钮主题。实际上,我们甚至有question on that topic here

我发生了什么事。我们可以使用两者吗?我的意思是,显然,你不能制作LPS& SZ(LPSZ?)字符串没有删除一些关于其中一些的好东西。

然而,由于字符串长度测量需要很长时间,因此对SZ的最大抱怨似乎是操作所需的时间。我对此有一个想法:

使所有字符串SZ。但是,我们还可以将字符串mod 256(即:len % 256)的长度存储在字符串之前的单个字节中。虽然它不会降低操作的复杂性,但它可能会以一个额外的字节为代价来大幅提高速度。

这个方案的主要优点是:

  1. 不限于任何特定尺寸
  2. 比正常SZ更快(最高256x)
  3. 兼容所有不同的内存大小
  4. 小字符串仍然非常节省空间(len中没有浪费的字节)
  5. 没有字符串问题
  6. 跨机器携带(见3& 5)
  7. 这就是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 ** 322 ** 64变得非常有价值。在其中一些情况下,实际上可能是考虑拆分字符串的好时机。特别是如果一个字符串溢出超出64位寻址空间的大小。

    无论如何,我想知道是否有其他人对这个概念有一些想法。我很肯定有可能我错过了为什么我之前没有在实践中看到这个概念。

    感谢您找到任何建议或问题!


    编辑:删除背景信息以使问题的意图更明显(我的算法中是否有任何潜在的缺陷,等等)


    注意:此算法主要用于帮助解决SZ

    中的速度问题

0 个答案:

没有答案