如何在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)实施实现? 在某些情况下,数据实际上在类中,并且没有动态分配的内存。