不可变字符串 vs std::string

69
我最近阅读了一些关于不可变字符串的资料(为什么Java和.NET中的字符串不能是可变的?)以及(为什么.NET的String是不可变的?),还有一些关于为什么D语言选择使用不可变字符串的内容。这似乎有许多优点。

  • 可以轻而易举地实现线程安全
  • 更加安全
  • 在大多数情况下,内存利用率更高
  • 廉价的子字符串(标记化和切片)

更不用说大多数新语言都采用了不可变字符串,例如 D 2.0、Java、C#、Python 等等。

C++是否从不可变字符串中受益?

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


更新:

有两个尝试实现不可变字符串:const_string fix_str。 它们都已经半个十年没有更新了。它们是否有用?为什么const_string从未被纳入boost?


43
你提出了一个非常详尽且有说服力的论点,BlueRaja。 - peterchen
6
蓝色拉杰并没有提出一个实际的论点,正如大家所清楚指出的那样。但他可能是正确的,因为C ++可能对于纯粹的不可变字符串的尝试来说过于混合了。当然,这更多地反映了C ++文化而不是语言本身。 - Steven Sudit
5
异议!Ruby的字符串不是不可变的! - Notinlist
1
它们自2005年以来就没有更新过,但是没有报告很多错误,所以我认为使用它们是可以的。 - Franklin Yu
11个回答

-5

C++字符串是线程安全的,所有不可变对象都保证是线程安全的,但Java的StringBuffer是可变的,就像C++字符串一样,它们都是线程安全的。为什么要担心速度问题?在定义方法或函数参数时,使用const关键字告诉编译器该字符串在该范围内是不可变的。此外,如果字符串对象是按需不可变的,在需要使用字符串之前等待,换句话说,当您将其他字符串附加到主字符串时,您有一个字符串列表,直到您实际需要整个字符串,然后它们在那一点上被连接在一起。

据我所知,不可变和可变对象以相同的速度运行,除了它们的方法,这是利弊的问题。常量原始数据类型和变量原始数据类型移动的速度不同,因为在机器级别上,变量被分配到寄存器或内存空间中,需要进行一些二进制操作,而常量是标签,不需要任何操作,因此更快(或者做的工作更少)。这仅适用于原始数据类型,而不适用于对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接