不可变字符串vs std :: string

def*_*ode 61 c++ string immutability

我最近一直在阅读有关不可变字符串的原因为什么字符串在Java和.NET中不可变为什么.NET字符串是不可改变的?以及为什么D选择不可变字符串的一些东西.似乎有很多好处.

  • 平凡的线程安全
  • 更安全
  • 在大多数用例中,内存效率更高.
  • 便宜的子串(标记化和切片)

更不用说大多数新语言都有不可变的字符串,D2.0,Java,C#,Python等.

C++会从不可变字符串中受益吗?

是否有可能在c ++(或c ++ 0x)中实现具有所有这些优点的不可变字符串类?


更新:

在不可变字符串const_stringfix_str上有两次尝试.五年内都没有更新.它们甚至被使用过吗?为什么const_string没有进入boost?

yoc*_*oco 45

我发现这个帖子中的大多数人并不真正理解它是什么immutable_string.它不仅仅是关于常数.真正的强大之处immutable_string在于性能(即使在单线程程序中)和内存使用情况.

想象一下,如果所有字符串都是不可变的,并且所有字符串都是如此实现的

class string {
    char* _head ;
    size_t _len ;
} ;
Run Code Online (Sandbox Code Playgroud)

我们如何实现sub-str操作?我们不需要复制任何字符.我们所要做的就是分配_head_len.然后子字符串与源字符串共享相同的内存段.

当然,我们不能仅使用两个数据成员实现immutable_string.实际实现可能需要引用计数(或飞加权)内存块.像这样

class immutable_string {
    boost::fly_weight<std::string> _s ;
    char* _head ;
    size_t _len ;
} ;
Run Code Online (Sandbox Code Playgroud)

在大多数情况下,内存和性能都会优于传统字符串,尤其是当您知道自己在做什么时.

当然C++可以从不可变的字符串中受益,而且有一个很好.我检查了Cubbi提到的boost::const_stringfix_str提到的.那些应该是我所说的.


小智 23

作为意见:

  • 是的,我非常喜欢C++的不可变字符串库.
  • 不,我不希望std :: string是不可变的.

它真的值得做(作为标准库功能)吗?我会说不.const的使用为您提供了本地不可变的字符串,系统编程语言的基本特性意味着您确实需要可变字符串.

  • 我在C++中最接近不可变字符串的是一个"span"类,它有两个const指针,一个用于开始,一个用于结束.它没有管理内存,但确实支持通常的实用程序功能(查找等).结果,它对解析非​​常有用. (3认同)
  • @StevenSudit:许多大型项目都有,尽管它通常被称为`stringref`或类似. (2认同)
  • @MooingDuck那是真的.Google称之为[StringPiece](https://code.google.com/p/re2/source/browse/re2/stringpiece.h) (2认同)
  • C++17中还有string_view,它似乎只是const。 (2认同)

Not*_*ist 9

我的结论是C++不需要不可变模式,因为它具有const语义.

在Java中,如果您有一个Person类并且String name使用该getName()方法返回该人员,则您唯一的保护是不可变模式.如果它不在那里你将不得不clone()昼夜不停地使用你的字符串(因为你必须处理不是典型值对象但仍需要保护的数据成员).

在C++中你有const std::string& getName() const.所以你可以写出SomeFunction(person.getName())它的样子void SomeFunction(const std::string& subject).

  • 没有复制品发生
  • 如果有人想要复制,他可以自由地复制
  • 技术适用于所有数据类型,而不仅仅是字符串

  • 更正!不可变字符串在多线程程序中很有用,因为它们在处理并发时没有过分夸大.大多数时候你不编辑你的字符串,你只需简单地替换它们. (4认同)