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

有没有像C或C ++中的intern()方法,就像在Java中一样? 如果没有,我怎样才能在C或C ++中进行字符串实习 ?

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

在C中是否有像C中的intern()方法一样的东西?

不在标准C库中。

如果没有,如何在C中进行字符串实习?

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

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

字符串实习在具有价值语义的语言中意味着什么? Interning是一种强制对象标识的机制,用于引用具有值标识的字符串。 它与使用引用语义并使用对象标识作为默认比较函数的语言相关。 默认情况下,C ++使用值语义,而像std::string这样的类型没有标识,因此实习没有意义。

一些实现(例如g ++)可以在幕后使用一种forms的字符串数据的引用语义。 作为扩展,这样的实现可以提供某种类型的数据实习。 (据我所知,G ++没有,但会自动“实习”空字符串。)

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