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