c – 使用公共部分压缩字符串

我有一个管理大量字符串的应用程序.字符串采用类似路径的格式,并且有许多共同的部分,但没有明确的规则.它们不是文件系统上的路径,但可以这样考虑.
我显然需要优化内存消耗,但不会造成很大的性能损失.

我正在考虑两种选择:
– 实现一个压缩存储数据的compressed_string类,但我需要一个固定的字典,我现在无法找到一个库.我不希望霍夫曼在字节上,我希望它在单词上.
– 在字符串部分上实现某种flyweight模式.

这个问题看起来很常见,我想知道什么是最好的解决方案,或者有人知道一个针对这个问题的库.

谢谢

解决方法

Strings are in a path-like format and have many common parts,but without a clear rule.

从某种意义上说,它们是表单名称的层次结构中的定位符,(分隔符,名称)*?如果是这样,您可以使用interning:将名称部分存储为指向字符串池的char const *元素.这样,您可以有效地压缩使用n次的名称,使其超过n * sizeof(char const *)strlen(name)字节.完整路径将成为一系列实习名称,例如一个std :: vector.

看起来sizeof(char const *)在64位硬件上很大,但你也节省了一些分配开销.或者,如果您因某种原因知道您将永远不需要超过65536个字符串,则可以将它们存储为

class interned_name
{
    uint16_t tab_idx;

  public:
    char const *c_str() const
    {
        return NAME_TABLE[tab_idx];
    }
};

其中NAME_TABLE是静态std :: unordered_map< uint16_t,char const *>.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...