如何在C或C ++中进行字符串实习?

时间:2012-05-17 11:31:43

标签: c++ c string-interning

在C或C ++中是否有类似intern()方法的东西在Java中?如果没有,我怎样才能在C或C ++中执行string interning

3 个答案:

答案 0 :(得分:16)

boost::flyweight< std::string >似乎正是您正在寻找的。

答案 1 :(得分:6)

  

在C中是否有类似intern()方法的东西,就像我们在Java中一样?

不在标准C库中。

  

如果没有,如何在C?

中进行字符串实习

我很害怕。第一个问题是&#34; string&#34;在C中不是一个明确定义的东西。相反,你有char *,它可能指向一个以零结尾的字符串,或者可能只是表示一个字符位置。然后你就会遇到一些问题,即某些字符串嵌入其他东西......或存储在堆栈中。这两者都使得实习变得不可能和/或无意义。然后,存在这样的问题:C字符串文字不能保证以Java保证的方式实现。最后,还有一个问题就是实习是等待发生的存储泄漏...如果语言没有被垃圾收集。

话虽如此,(尝试)在C中实现实习的方法是创建一个哈希表来保存实习字符串。除非它是文本或在其自己的堆节点中分配的字符串,否则您需要将它作为不能实习字符串的前提条件。为了解决存储泄漏问题,您需要一个每字符串引用计数来检测何时可以丢弃一个内部字符串。

答案 2 :(得分:2)

字符串实习在具有价值的语言中意味着什么 语义?实习是一种强制对象身份的机制 引用具有值标识的字符串。它与语言相关 它使用引用语义并使用对象标识作为默认值 比较功能。 C ++默认使用值语义和类型 像std::string一样没有身份,所以实习没有意义。

某些实现(例如g ++)可能使用一种形式的引用语义 对于字符串数据,在幕后。这样的实现可以 作为扩展提供某种数据实习。 (G ++ 据我所知,并没有自动“实习生”空着 字符串。)

大多数其他实现甚至不使用引用语义 内部。你会如何使用小实习生实施 字符串优化(如MS)?数据在字面上的类别 在某些情况下,并且没有动态分配内存。