def*_*ode 61 c++ string immutability
我最近一直在阅读有关不可变字符串的原因为什么字符串在Java和.NET中不可变?而为什么.NET字符串是不可改变的?以及为什么D选择不可变字符串的一些东西.似乎有很多好处.
更不用说大多数新语言都有不可变的字符串,D2.0,Java,C#,Python等.
C++会从不可变字符串中受益吗?
是否有可能在c ++(或c ++ 0x)中实现具有所有这些优点的不可变字符串类?
更新:
在不可变字符串const_string和fix_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_string和fix_str提到的.那些应该是我所说的.
小智 23
作为意见:
它真的值得做(作为标准库功能)吗?我会说不.const的使用为您提供了本地不可变的字符串,系统编程语言的基本特性意味着您确实需要可变字符串.
我的结论是C++不需要不可变模式,因为它具有const语义.
在Java中,如果您有一个Person类并且String name使用该getName()方法返回该人员,则您唯一的保护是不可变模式.如果它不在那里你将不得不clone()昼夜不停地使用你的字符串(因为你必须处理不是典型值对象但仍需要保护的数据成员).
在C++中你有const std::string& getName() const.所以你可以写出SomeFunction(person.getName())它的样子void SomeFunction(const std::string& subject).