首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >不可变字符串与std::string

不可变字符串与std::string
EN

Stack Overflow用户
提问于 2010-05-27 04:05:57
回答 11查看 38.7K关注 0票数 66

我最近读了一些关于不可变字符串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_stringfix_str有两次尝试。这两个版本在过去的五年中都没有更新过。它们甚至被使用过吗?为什么const_string没有进入boost?

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2010-05-27 04:10:43

作为一种观点:

  • 是的,我非常想要一个用于C++的不可变的字符串库。
  • 否,我不希望std::string是不可变的。

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

票数 25
EN

Stack Overflow用户

发布于 2011-05-16 19:35:18

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

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

代码语言:javascript
复制
class string {
    char* _head ;
    size_t _len ;
} ;

我们如何实现一个子字符串操作?我们不需要复制任何字符。我们所要做的就是分配_head_len。则该子串与源串共享相同的存储器段。

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

代码语言:javascript
复制
class immutable_string {
    boost::fly_weight<std::string> _s ;
    char* _head ;
    size_t _len ;
} ;

在大多数情况下,内存和性能都会比传统的字符串更好,特别是当你知道自己在做什么的时候。

当然,C++可以从不可变的字符串中获益,拥有一个这样的字符串是很好的。我已经检查了Cubbi提到的boost::const_stringfix_str。这些应该就是我所说的。

票数 50
EN

Stack Overflow用户

发布于 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())

  • No copy happened
  • 如果任何人想要复制,他可以自由执行此操作
  • 技术适用于所有数据类型,而不仅仅是字符串
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2916358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档