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