为什么VC的std:string似乎不是"lazy evaluation"的实现?解决方法
为什么VC的std::string似乎不是"lazy evaluation"的实现?
More effective C++ 上面说,string应该是lazy evaluation的实现,也就是"写时拷贝"。例如
string s1="abc";
string s2=s1;
这里s2所包含的char*指针指向s1的内容。除非s2的内容被修改,才先做一份拷贝。
但是我试验了一下,VC的实现不是这样的:
发现两个指针的内容不同(Debug/Release都不同)。但是GCC下面实验发现是相同的。
这是为什么呢? VC的string实现没有使用lazy evaluation吗?
------解决方案--------------------
本来对string的实现标准就没做任何规定,所以这个就不要有什么统一的想法了。
------解决方案--------------------
老的版本好像是的(记不清了),新的版本不是
------解决方案--------------------
lazy evaluation和copy on write完全是两码事。
另外现在就算要优化一般也是用引用计数,COW不常见。
------解决方案--------------------
顺便取底层数据应该用data()。c_str()每次调用都不见得会相同。
(虽然C++11中是同义词了。)
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中是同义词了。)