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

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

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

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

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

可以看到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的时候并没有重新申请一份新的内存,而是在原来的字符串上增加了一个引用计数,只有当这块内存真正被修改的时候,才会给这个字符串重新申请一块内存,这样增加了字符串复制的效率,对于一些只读的字符串,效率提升是非常大的,然而对于那些要修改字符串内容的程序来说,这只是把内存申请和拷贝的开销延迟到字符串修改的时候而已。

你可能感兴趣的:(C++)