C++的std::string的“读时也拷贝”技术!
2011-07-16 17:30
288 查看
C++的std::string的“读时也拷贝”技术!
2009年9月19日Neo 发表评论阅读评论 2,676 次点击 C++的std::string的读时也拷贝技术!嘿嘿,你没有看错,我也没有写错,是读时也拷贝技术。什么?我的错,你之前听说写过时才拷贝,嗯,不错的确有这门技术,英文是Copy On Write,简写就是COW,非常’牛’!那么我们就来看看这个’牛’技术的效果吧。
我们先编写一段程序
现在我们来对这个string加点料!
我们再来看看另外一种情况!
以上都证明了我们的COW技术非常牛!
有太阳就有黑暗,这句说是不是有点耳熟?
不错,为了避免了你通过[]操作符获取string内部指针而直接修改字符串的内容,在你使用了the_base[0]后,这个字符串的写时才拷贝技术就失效了。
C++标准的确就是这样的,C++标准认为,当你通过迭代器或[]获取到string的内部地址的时候,string并不知道你将是要读还是要写。这是它无法确定,为此,当你获取到内部引用后,为了避免不能捕获你的写操作,它在此时废止了写时才拷贝技术!
这样看来我们在使用COW的时候,一定要注意,如果你不需要对string的内部进行修改,那你就千万不要使用通过[]操作符和迭代器去获取字符串的内部地址引用,如果你一定要这么做,那么你就必须要付出代价。当然,string还提供了一些使迭代器和引用失效的方法。比如说push_back,等, 你在使用[]之后再使用迭代器之后,引用就有可能失效了。那么你又回到了COW的世界!比如下面的一个例子
另外:上述例子是在linux环境下编译的,使用STL是GNU的STL。windows上我用的是vs2003,但是非常明显vs2003一点都不支持COW。
这篇文章出自http://ridiculousfish.com/blog/archives/2009/09/17/i-didnt-order-that-so-why-is-it-on-my-bill-episode-2/ 这里,我使用了它的例子。但是我重新自己组织了内容。
相关文章推荐
- C++的std::string的读时也拷贝技术!
- C++ 的std::string的“读时也拷贝”技术!
- C++的std::string的“读时也拷贝”技术!
- C++的std::string的“读时也拷贝”技术!
- C++的std::string的“读时也拷贝”技术
- C++的std::string的“读时也拷贝”技术!
- zz C++的std::string的“读时也拷贝”技术
- C/C++ std::string 切词
- C++填坑之std::string::find_first_of
- 标准C++类std::string的内存共享和Copy-On-Write(写时拷贝)
- C++编译出现binding ‘const string {aka const std::__cxx11::basic_string<char>}’ to reference of type ‘std
- std::string的内存共享和Copy-On-Write技术
- 实战c++中的string系列--std:vector<char> 和std:string相互转换(vector to stringstream)
- [C++]char* const char* std::string区分
- 【C++】MFC中的CString和std::string,以及两者之间的相互转换(基于VS201X版本)
- 如何在C++中方便的将float、int等类型数据转换成string类型,并利用ROS中的std_msg/String发布出去
- C++ 由std::string转为LPCWSTR
- char * 转换为std::string是内存拷贝了吗?
- C++: std::string 与 Unicode 如何结合?
- C++ std::string --- 你可能不知道的一些用法