在C或C ++中是否有类似intern()
方法的东西在Java中?如果没有,我怎样才能在C或C ++中执行string interning?
答案 0 :(得分:16)
boost::flyweight< std::string >
似乎正是您正在寻找的。 p>
答案 1 :(得分:6)
在C中是否有类似intern()方法的东西,就像我们在Java中一样?
不在标准C库中。
如果没有,如何在C?
中进行字符串实习
我很害怕。第一个问题是&#34; string&#34;在C中不是一个明确定义的东西。相反,你有char *
,它可能指向一个以零结尾的字符串,或者可能只是表示一个字符位置。然后你就会遇到一些问题,即某些字符串嵌入其他东西......或存储在堆栈中。这两者都使得实习变得不可能和/或无意义。然后,存在这样的问题:C字符串文字不能保证以Java保证的方式实现。最后,还有一个问题就是实习是等待发生的存储泄漏...如果语言没有被垃圾收集。
话虽如此,(尝试)在C中实现实习的方法是创建一个哈希表来保存实习字符串。除非它是文本或在其自己的堆节点中分配的字符串,否则您需要将它作为不能实习字符串的前提条件。为了解决存储泄漏问题,您需要一个每字符串引用计数来检测何时可以丢弃一个内部字符串。
答案 2 :(得分:2)
字符串实习在具有价值的语言中意味着什么
语义?实习是一种强制对象身份的机制
引用具有值标识的字符串。它与语言相关
它使用引用语义并使用对象标识作为默认值
比较功能。 C ++默认使用值语义和类型
像std::string
一样没有身份,所以实习没有意义。
某些实现(例如g ++)可能使用一种形式的引用语义 对于字符串数据,在幕后。这样的实现可以 作为扩展提供某种数据实习。 (G ++ 据我所知,并没有自动“实习生”空着 字符串。)
大多数其他实现甚至不使用引用语义 内部。你会如何使用小实习生实施 字符串优化(如MS)?数据在字面上的类别 在某些情况下,并且没有动态分配内存。