我最近读了一些关于不可变字符串Why can't strings be mutable in Java and .NET?和Why .NET String is immutable?的文章,还有一些关于D为什么选择不可变字符串的文章。这似乎有很多好处。
更不用说大多数新语言都有不可变的字符串,D2.0,Java,C#,Python等等。
C++会从不可变的字符串中获益吗?
有没有可能在c++ (或c++0x)中实现一个具有所有这些优点的不可变字符串类?
更新:
对于不可变字符串const_string和fix_str有两次尝试。这两个版本在过去的五年中都没有更新过。它们甚至被使用过吗?为什么const_string没有进入boost?
发布于 2010-05-27 04:10:43
作为一种观点:
它真的值得去做吗(作为一个标准库功能)?我会说不是。const的使用为您提供了本地不可变的字符串,而系统编程语言的基本性质意味着您确实需要可变字符串。
发布于 2011-05-16 19:35:18
我发现这个帖子中的大多数人并不真正理解immutable_string
是什么。这不仅仅是关于稳定性的。immutable_string
的真正强大之处在于性能(即使在单线程程序中也是如此)和内存使用。
想象一下,如果所有字符串都是不可变的,并且所有字符串都是这样实现的
class string {
char* _head ;
size_t _len ;
} ;
我们如何实现一个子字符串操作?我们不需要复制任何字符。我们所要做的就是分配_head
和_len
。则该子串与源串共享相同的存储器段。
当然,我们不能仅仅使用这两个数据成员来实现immutable_string。真正的实现可能需要一个引用计数(或飞行加权)的内存块。像这样
class immutable_string {
boost::fly_weight<std::string> _s ;
char* _head ;
size_t _len ;
} ;
在大多数情况下,内存和性能都会比传统的字符串更好,特别是当你知道自己在做什么的时候。
当然,C++可以从不可变的字符串中获益,拥有一个这样的字符串是很好的。我已经检查了Cubbi提到的boost::const_string
和fix_str
。这些应该就是我所说的。
发布于 2011-05-05 17:52:59
我的结论是C++不需要不可变模式,因为它具有常量语义。
在Java语言中,如果您有一个Person
类,并且使用getName()
方法返回person的String name
,那么惟一的保护就是不可变模式。如果它不在那里,您将不得不整夜clone()
您的字符串(就像您必须对不是典型的值对象的数据成员所做的那样,但仍然需要保护)。
在C++中有const std::string& getName() const
。因此,您可以在类似void SomeFunction(const std::string& subject)
的地方编写SomeFunction(person.getName())
。
https://stackoverflow.com/questions/2916358
复制相似问题