我只是在阅读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::vector
或std::array
?哪些编译器支持该优化(特别是,我想知道G ++,英特尔C ++编译器和Microsoft C ++编译器)?
答案 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。
见这里: