标准C++类std::string的内存共享和Copy-On-Write技术
虽然vc6用了引用计数,但VC2003的字符串并没使用Copy-On-Write的特征.正如楼主例子里面 str1[1]='q',时系统要重新给st1分配了内存。早分配还是晚分配? 假设str2没有使用,对于release版本那都是只分配一次内存。但不考虑引用计数 str1[1]='q'操作,早分配速度反倒好过晚分配, 省掉了对引用计算判断的代码。显然随着编译器优化的日益强大,能给我们更多的选择。
http://community.csdn.net/Expert/TopicView3.asp?id=4707818
sizeof(string)一般大于14; 里面有成员变量。 vc 的 string 没有引用技术,随便调试一下就知道了。 string str1="123";string str2=str1; 很明显他们的缓冲区地址不同。微软的CString 使用了引用计数。CString str1="123";CString str2=str1; 里面缓冲区指向了相同的地址。如果使用 CString做楼主的例子也差不多。 dev不知道什么版本stl,使用了引用计数但不管CString 也好,dev 也好对于 char c[] = "china"; string str = c; 是没有什么引用计数的, 只有 string 之间赋值才会使用引用计数. 如果使用release 版本测试编译器回开你玩笑的搂主的结果跟我在vc2003 里的 release 版查不多。string 快是因为 string 被优化在循环外面在栈上面已经定义了这个变量。而且在加上初始了一定的空间。相当于第二个程序没有了 new 和delete 操作.对应情况可以同过反汇编调出来。总体来说楼主的应该 char*, 比较有速度(字符串长度不太短的话).
虽然vc6用了引用计数,但VC2003的字符串并没使用Copy-On-Write的特征.正如楼主例子里面 str1[1]='q',时系统要重新给st1分配了内存。早分配还是晚分配? 假设str2没有使用,对于release版本那都是只分配一次内存。但不考虑引用计数 str1[1]='q'操作,早分配速度反倒好过晚分配, 省掉了对引用计算判断的代码。显然随着编译器优化的日益强大,能给我们更多的选择。
http://community.csdn.net/Expert/TopicView3.asp?id=4707818
sizeof(string)一般大于14; 里面有成员变量。 vc 的 string 没有引用技术,随便调试一下就知道了。 string str1="123";string str2=str1; 很明显他们的缓冲区地址不同。微软的CString 使用了引用计数。CString str1="123";CString str2=str1; 里面缓冲区指向了相同的地址。如果使用 CString做楼主的例子也差不多。 dev不知道什么版本stl,使用了引用计数但不管CString 也好,dev 也好对于 char c[] = "china"; string str = c; 是没有什么引用计数的, 只有 string 之间赋值才会使用引用计数. 如果使用release 版本测试编译器回开你玩笑的搂主的结果跟我在vc2003 里的 release 版查不多。string 快是因为 string 被优化在循环外面在栈上面已经定义了这个变量。而且在加上初始了一定的空间。相当于第二个程序没有了 new 和delete 操作.对应情况可以同过反汇编调出来。总体来说楼主的应该 char*, 比较有速度(字符串长度不太短的话).