免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 8489 | 回复: 16
打印 上一主题 下一主题

请问:关于string 赋值 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-08-03 20:28 |只看该作者 |倒序浏览
string s;
s.reserve(100);

string s_another("another");

s = s_another; <<----------- 这句是否会把s自己的缓冲区释放掉,而s与s_another共用同一个缓冲区?

在VC下是的,如何让s用自己的缓冲区,而不与s_another用一样的?

论坛徽章:
0
2 [报告]
发表于 2006-08-03 20:50 |只看该作者
string 类型是有 copy constructor 和 copy assignment,是没这个问题的

论坛徽章:
0
3 [报告]
发表于 2006-08-03 20:57 |只看该作者
>>在VC下是的
不知道你的这个结论是怎么得来的,如果VC下真的是这样的,那么设计VC的STL的家伙会被开除的

论坛徽章:
0
4 [报告]
发表于 2006-08-03 21:09 |只看该作者
- -LZ这个结论是怎么得出来的?

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
5 [报告]
发表于 2006-08-03 21:14 |只看该作者
原帖由 converse 于 2006-8-3 20:57 发表
>>在VC下是的
不知道你的这个结论是怎么得来的,如果VC下真的是这样的,那么设计VC的STL的家伙会被开除的

应该有可能吧?不是一般会用COW实现的么?不过释放不释放就不知道了,但应该有可能指向同一块内存。

[ 本帖最后由 THEBEST 于 2006-8-3 21:15 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2006-08-03 21:17 |只看该作者
有些类库的string有可能是share buffer的,ms 的stl应该不是这样的。

论坛徽章:
0
7 [报告]
发表于 2006-08-04 01:11 |只看该作者
copy on write

论坛徽章:
0
8 [报告]
发表于 2006-08-04 02:21 |只看该作者
无所谓,除非你对施放很感兴趣,在析购的时候都会删的。懒得看string的实现了。可能会realloc。

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
9 [报告]
发表于 2006-08-04 08:57 |只看该作者
XSTRING 中关于string赋值的实现:
        _Myt& assign(const _Myt& _X, size_type _P, size_type _M)
                {if (_X.size() < _P)
                        _Xran();
                size_type _N = _X.size() - _P;
                if (_M < _N)
                        _N = _M;
                if (this == &_X)
                        erase((size_type)(_P + _N)), erase(0, _P);
                else if (0 < _N && _N == _X.size()
                        && _Refcnt(_X.c_str()) < _FROZEN - 1
                        && allocator == _X.allocator)
                        {_Tidy(true);
                        _Ptr = (_E *)_X.c_str();
                        _Len = _X.size();
                        _Res = _X.capacity();
                        ++_Refcnt(_Ptr); }

                else if (_Grow(_N, true))
                        {_Tr::copy(_Ptr, &_X.c_str()[_P], _N);
                        _Eos(_N); }
                return (*this); }

可见在VC中是共用了缓冲区,而且对缓冲区记录了引用次数(reference count),当对缓冲进行写操作,如果Refcnt>1,则会重新分配,也就是写时复制。

[ 本帖最后由 yuxh 于 2006-8-4 09:03 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2006-08-04 09:30 |只看该作者
就算是共用,也会copy on write,对于使用者,完全可以把它当成不共用。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP