【朝花夕拾】C++ string的写时拷贝机制以及容易出现的问题

上一篇我们分析了VS2008下的stl string的代码,现在我们分析下g++下的stl string 的代码。首先我们来看下他的内存增长策略:

代码很简单,执行结果如下:

可以看到gcc stl就是和我之前面试的时候说的那样,简单粗暴的倍增策略


进入正题,本次实验使用g++编译器,用于测试C++ string的写实拷贝机制

先看一段代码:

void testStringCopyInWrite() {
    string str1 = "123756";
    char* szStr = (char *)str1.data();
    string str2 = str1;
    printf("str1 = [%s], str2 = [%s]\n", str1.c_str(), str2.c_str());
    szStr[3] = '4';
    printf("str1 = [%s], str2 = [%s]\n", str1.c_str(), str2.c_str());
}

先看下在VS下的执行结果

没毛病,和我们预期的想法一致。那我们拿到G++编译器上搞一把。

因缺思厅,执行完之后两个字符串都被改变了,到底发生了什么...为啥VS下和G++下执行的结果不一样。

原来VS在VC6.0之后就不适用写时拷贝机制了,而g++确在一直使用,在g++中当字符串1赋值给字符串2的时候并没有重新申请一份新的内存,而是在原来的字符串上增加了一个引用计数,只有当这块内存真正被修改的时候,才会给这个字符串重新申请一块内存,这样增加了字符串复制的效率,对于一些只读的字符串,效率提升是非常大的,然而对于那些要修改字符串内容的程序来说,这只是把内存申请和拷贝的开销延迟到字符串修改的时候而已。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值