stl::string与.NET和java中String类型的设计差异讨论

Mattary 2004-03-31 10:58:50
在Java和.NET中,为什么都要将String类型设计成不变体?
而stl中的string就是可变体,它们是基于什么设计考虑的?为什么会有设计差异
它们之间的优,劣势是什么?
...全文
30 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
hyifeng 2004-04-01
  • 打赏
  • 举报
回复
Wolf0403,我真是佩服你什么都能学的那么好。

回家试了一下,IL显示string一开始就实例化为System.String,不象int需经过装箱。
还有,果真预构造了原代码中出现的字符串形成一个“字符串池”。

std::basic_string<>也可能因为会重新分配内存,不是线程安全的。

那么如果我要在C++使用一个线程安全的字符串可以使用什么?

“String 作为“不变体”,猜想是可以提高效率”,怎解?
nirvana_li 2004-03-31
  • 打赏
  • 举报
回复
我也不大明白这个意思。什么是不变体,什么是可变体。但我不同意楼上所说的JAVA中的string不是基本数据类型,而是对象。
hyifeng 2004-03-31
  • 打赏
  • 举报
回复
不过string在java和.NET中是作为基本数据类型,应该保持对象的单一性,大概对应于C++的BSTR类型(也是VB中采用的存储结构)。

作为对应std::string的功能,提供了StringBuilder之类字符串构造类。
Jinhao 2004-03-31
  • 打赏
  • 举报
回复
不懂Java,什么叫不变体?是不是C++中非mutable对象呀????
nirvana_li 2004-03-31
  • 打赏
  • 举报
回复
恩,楼上的好像有点道理
hyifeng 2004-03-31
  • 打赏
  • 举报
回复
北极猩猩 2004-03-31
  • 打赏
  • 举报
回复
一大原因是Java和.net中支持自动的垃圾回收机制,因为如果将对象设计为immutable那么再进行操作的时候会隐式的产生大量的新对象,对于不支持自动垃圾回收的C++来说,如何释放这些对象将是一个巨大的问题。

对象实现为immutable最大的作用就是绝对的线程安全。而C++ string的实现至少在标准中是没有声明为线程安全的。
hyifeng 2004-03-31
  • 打赏
  • 举报
回复
to Solstice(大佛):
现在的std::basic_string<>的实现好象不鼓励COW的实现了,应该不担心线程安全的问题。
Wolf0403 2004-03-31
  • 打赏
  • 举报
回复
不特别喜欢 .net C# 就是因为 C# 中有太多的“特例”。。。不知道 VC++.NET 中是怎么处理的。。。例如 delegate 和 string
.net 中 string,就是 System.String,是一个引用对象,但是却有值对象的处理方法。。。例如 operator= 等等。
.net 的 System.String 不存在所谓“支持自动装箱”机制。装箱 boxing 是针对 value type 而言的,也就是 System.ValueType 的派生,各种 struct 。String 本身不是值类型,虽然具有一定值类型的特点,我们还是不能说它支持“自动装箱”操作吧。。

String 作为“不变体”,猜想是可以提高效率以及维护多线程安全。
另外一个,可能可以对作为不变体的 String 进行相当大幅度的编译器优化,譬如启用字符串池等等。。。
hyifeng 2004-03-31
  • 打赏
  • 举报
回复
其实可以把他看作是一个和字符数组相当的意义单一的类型。

要应用高级功能,可以使用相应的功能类。
hyifeng 2004-03-31
  • 打赏
  • 举报
回复
我也不知道该如何称呼,大概叫“基础数据类型”吧。
java我不是熟悉,不过我知道string的确都是类类型,
可是在.net framework中string是“基础的”,他支持自动装箱,意义上只描述一个简单字符串。

如果对于一个相对原始的数据类型,引入std::basic_string<>的变体特性(意思就是把StringBuilder的功能合并进来),那么当存在一个类似于DataTable的容器,里面的一列有几千上万条不会修改的短字符串(可能是英文单词),那么额外维护的capacity就是一个巨大的开销。
陈硕 2004-03-31
  • 打赏
  • 举报
回复
我猜想到的两种可能:1. 为了多线程安全, 2. 便于垃圾回收。
adamsun 2004-03-31
  • 打赏
  • 举报
回复
??
adamsun 2004-03-31
  • 打赏
  • 举报
回复
Invariant, Variant

24,855

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧