如何在C或C++中进行字符串驻留?

13

在C或C++中是否有类似于Java中的intern()方法?如果没有,如何在C或C++中执行字符串驻留


2
只需编写您想要的代码。 - David Schwartz
3
Suhail,你看过这些问题吗:https://dev59.com/0HNA5IYBdhLWcg3wC5JR,http://stackoverflow.com/questions/4060411/does-stdstring-use-string-interning? - dbf
听起来你正在寻找 boost::flyweight< std::string >,所有相同的字符串将使用相同的内存。 - Ylisar
1
在 "C/C++" 中是否有类似于 intern() 方法的东西?没有。在 C/C++ 中没有。QED。 - R. Martinho Fernandes
3
@R. Martinho Fernandes 我问了关于C C++的问题。 - Suhail Gupta
显示剩余6条评论
3个回答

20

boost::flyweight< std::string > 看起来正是您需要的。


1
有没有其他方法?我不知道这个库。 - Suhail Gupta
@Erick Robertson,但还有其他方法吗? - Suhail Gupta
1
@SuhailGupta如果我知道其他方法,我会添加另一个答案。 - Erick Robertson
如果你可以忍受接口 typedef std::hash_set< std::string > StringCache;,那么你将得到一个不太花哨的版本。C++标准库本身与大多数其他语言相比非常基础。 - Ylisar
请注意,boost::flyweight 要求对象是不可变的;而 std::string 并非如此。像 [] 这样的操作可能会导致问题(或者不会,这取决于对象之后的使用方式)。 - James Kanze
4
更准确地说,boost::flyweight使对象成为不可变的,使用[]不会引起问题,因为boost::flyweight< T >只会暴露出const T&。 - Ylisar

6
在标准C库中没有类似Java中intern()方法的东西。
如果没有,那么如何在C中执行字符串内部化呢?恐怕很难。首先,"字符串"在C中不是一个明确定义的东西,而是有可能指向零结尾字符串或仅表示字符位置的char *。然后你会遇到一些字符串嵌入到其他东西中或存储在堆栈上的问题,这两种情况都使得内部化变得无法实现或毫无意义。此外,C字符串文本并不能像Java一样保证可以被内部化。最后,内部化是一种泄漏存储空间的方式,除非该语言支持垃圾回收。
虽然如此,在C中(尝试)实现内部化的方法是创建一个哈希表来保存内部化的字符串。你需要将其前提条件设为,只有字符串是字面量或分配在自己的堆节点中,才能进行内部化。为了解决存储泄漏问题,你需要一个每个字符串的参考计数器来检测何时可以丢弃内部化的字符串。

3
在采用值语义的语言中,字符串池意味着什么?字符串池是一种强制对象标识与值相同的字符串引用的机制。它在使用引用语义并将对象标识用作默认比较函数的语言中具有相关性。C++默认使用值语义,并且像std::string这样的类型没有标识,因此使用字符串池毫无意义。
某些实现(例如g++)可能在幕后使用一种形式的字符串数据引用语义。这样一个实现可能以扩展方式提供对该数据的字符串池化。 (据我所知,G ++没有这样做,但会自动“池化”空字符串。)
大多数其他实现甚至不会在内部使用引用语义。如何在使用小字符串优化的实现中进行字符串池化(例如MS)?在某些情况下,数据实际上就在类中,没有动态分配的内存。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接