社区
工具平台和程序库
帖子详情
stl::string与.NET和java中String类型的设计差异讨论
Mattary
2004-03-31 10:58:50
在Java和.NET中,为什么都要将String类型设计成不变体?
而stl中的string就是可变体,它们是基于什么设计考虑的?为什么会有设计差异
它们之间的优,劣势是什么?
...全文
30
14
打赏
收藏
stl::string与.NET和java中String类型的设计差异讨论
在Java和.NET中,为什么都要将String类型设计成不变体? 而stl中的string就是可变体,它们是基于什么设计考虑的?为什么会有设计差异 它们之间的优,劣势是什么?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
STL
编程轻松入门(lwbeyond:http://blog.csdn.
net
/lwbeyond/article/details/5940743)
本教程旨在传播和普及
STL
的基础知识,若能借此机会为
STL
的推广做些力所能及的事情,到也是件让人愉快的事情。 1 初识
STL
:解答一些疑问 1.1 一个最关心的问题:什么是
STL
"什么是
STL
?",假如你对
STL
还知...
C++
STL
:关联容器之set和multiset
前面介绍了 map 容器和 multimap 容器,类似地,C++
STL
标准库
中
还提供有 set 和 multiset 这 2 个容器,它们也属于关联容器。more和 map、multimap 容器不同,使用 set 容器存储的各个键值对,要求键 key 和值 ...
http://c.biancheng.
net
/
http://c.biancheng.
net
/view/2343.html 标题是:C++ static_cast、dynamic_cast、const_cast和reinterpret_cast(四种
类型
转换运算符)http://c.biancheng.
net
/view/410.html 标题是:C++强制
类型
转换运算符...
2024年
Java
面试八股文(20w字)
目录第一章-
Java
基础篇1、你是怎样理解OOP面向对象 难度系数:⭐2、重载与重写区别 难度系数:⭐3、接口与抽象类的区别 难度系数:⭐4、深拷贝与浅拷贝的理解 难度系数:⭐5、sleep和wait区别 难度系数:⭐6、什么是...
转载http://blog.csdn.
net
/augusdi/article/details/11773163
C++11标准发布已有一段时间了, 维基百科上有对C++11新标准的变化和C++11新特性介绍的文章. 我是一名C++程序员,非常想了解一下C++11. 英文版的维基百科看起来非常费劲,而
中
文版维基百科不是知道是台湾还是香港人...
工具平台和程序库
24,855
社区成员
27,343
社区内容
发帖
与我相关
我的任务
工具平台和程序库
C/C++ 工具平台和程序库
复制链接
扫一扫
分享
社区描述
C/C++ 工具平台和程序库
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章