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

How can I do string interning in C or C++?

本文关键字:字符串 C++      更新时间:2023-10-16

C中是否有类似intern()方法或Java中C++方法?如果没有,如何在 C 或 C++ 中进行字符串实习?

boost::flyweight< std::string >似乎

正是您要找的。

C中是否有类似我们在Java中的intern((方法

不在标准 C 库中。

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

恐怕非常困难。 第一个问题是"字符串"在 C 中不是一个定义明确的东西。 相反,您有 char * ,它可能指向以零结尾的字符串,或者可能只表示字符位置。 然后你会遇到一些字符串嵌入到其他东西中的问题......或存储在堆栈上。 这两者都使实习变得不可能和/或毫无意义。 然后,还有一个问题是 C 字符串文字不能保证被拘留......以Java保证的方式。 最后,还有一个问题是实习是等待发生的存储泄漏......如果语言不是垃圾回收。

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

字符串实习在具有价值的语言中意味着什么语义学? 实习是一种强制对象标识的机制对具有值标识的字符串的引用。 它与语言相关使用引用语义并使用对象标识作为默认值比较功能。 C++默认使用值语义,并且类型就像std::string没有身份一样,所以实习是没有意义的。

一些实现(例如 g++(可能使用某种形式的引用语义对于字符串数据,幕后。 这样的实现可以提供该数据的某种实习,作为扩展。 (G++据我所知,没有,但会自动"实习"为空字符串。

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