STL中的写时复制支持

时间:2013-06-25 13:06:23

标签: c++ compiler-construction stl copy-on-write

我只是在阅读a Wikipedia article on Copy-on-write(好奇,如果有任何支持它的文件系统),并对以下段落感到惊讶:

  

COW也在内核之外,库,应用程序和系统代码中使用。例如,C ++标准库提供的字符串类是专门为允许写入时实现而设计的:

std::string x("Hello");

std::string y = x;  // x and y use the same buffer

y += ", World!";    // now y uses a different buffer
                    // x still uses the same old buffer

我不知道STL中是否支持copy-on-write。真的吗?它是否适用于其他STL类,例如std::vectorstd::array?哪些编译器支持该优化(特别是,我想知道G ++,英特尔C ++编译器和Microsoft C ++编译器)?

2 个答案:

答案 0 :(得分:8)

  

例如,C ++标准库提供的字符串类是专门为允许写入时实现而设计的

这是半真半假的。是的,它开始考虑COW的设计。但是在匆忙中,std :: string的公共接口搞砸了。导致它变得厌恶COW。这些问题是在标准出版后发现的,从那以后我们就一直坚持下去。因为当前的std::string代码不能被线程安全地COW编辑,并且在野外实现不会这样做。

如果你想要一个使用COW的字符串,可以从另一个库中获取它,比如MFC / ATL中的CString。

答案 1 :(得分:2)

gcc使用std :: string的copy-by-reference。从版本4.8开始,它仍然在为C ++ 11做,尽管它是violating the standard

见这里: