10

我刚刚阅读了一篇关于 Copy-on-write 的 Wikipedia 文章(好奇是否有任何文件系统支持它),并对以下段落感到惊讶:

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++ 编译器和 Microsoft C++ 编译器)?

4

2 回答 2

10

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

那是半真半假。是的,它从 COW 开始设计。但在匆忙中,std::string 的公共接口被搞砸了。导致它变得对母牛充满敌意。这些问题是在标准发布后才发现的,从那以后我们就一直坚持下去。就目前而言,目前std::string不能进行线程安全的 COW 编辑,并且野外的实现也不会这样做。

如果您想要一个使用 COW 的字符串,请从另一个库中获取它,例如 MFC/ATL 中的 CString。

于 2013-06-25T13:42:08.733 回答
2

gcc 对 std::string 使用按引用复制。从 4.8 版开始,它仍在为 C++11 执行此操作,尽管它违反了标准.

看这里:

于 2015-08-15T18:34:57.340 回答