读书人

为什么VC的std:string似乎不是quot;lazy e

发布时间: 2012-03-30 17:32:09 作者: rapoo

为什么VC的std::string似乎不是"lazy evaluation"的实现?
More effective C++ 上面说,string应该是lazy evaluation的实现,也就是"写时拷贝"。例如
string s1="abc";
string s2=s1;
这里s2所包含的char*指针指向s1的内容。除非s2的内容被修改,才先做一份拷贝。

但是我试验了一下,VC的实现不是这样的:

C/C++ code
#include<string>using namespace std;int main(void){    string s1="abc";    string s2=s1;    printf("%p,%p\n",s1.c_str(),s2.c_str());    return 0;}

发现两个指针的内容不同(Debug/Release都不同)。但是GCC下面实验发现是相同的。
这是为什么呢? VC的string实现没有使用lazy evaluation吗?

[解决办法]
本来对string的实现标准就没做任何规定,所以这个就不要有什么统一的想法了。
[解决办法]
老的版本好像是的(记不清了),新的版本不是
[解决办法]
lazy evaluation和copy on write完全是两码事。
另外现在就算要优化一般也是用引用计数,COW不常见。


[解决办法]
顺便取底层数据应该用data()。c_str()每次调用都不见得会相同。
(虽然C++11中是同义词了。)

读书人网 >C++

热点推荐