STL中的写时复制支持

Copy-on-write support in STL

本文关键字:复制 支持 STL      更新时间:2023-10-16

我刚刚读到维基百科上一篇关于写时复制的文章(很好奇是否有任何文件系统支持它),并对以下段落感到惊讶:

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完全支持写时复制。这是真的吗?它是否适用于其他STL类,例如std::vectorstd::array?哪些编译器支持这种优化(特别是,我想知道G++、英特尔C++编译器和微软C++编译器)?

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

这是一半的事实。是的,它在设计之初就考虑到了COW。但在匆忙中,std::string的公共接口被搞砸了。导致它变得对COW充满敌意。这些问题是在标准发布后发现的,从那以后我们就一直坚持下去。按照目前的情况,std::string不能被线程安全地COW,而野外的实现也不能做到这一点

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

gcc对std::string使用引用复制。从4.8版本开始,尽管它违反了标准,但它仍然在为C++11做这件事。

请参阅此处:

  • 在GCC 4.x/C++11中是否引用了std::string
  • 关闭GCC中的COW