根据GCC 5发布更改页面(https://gcc.gnu.org/gcc-5/changes.html)的描述:
默认启用了std :: string的新实现,使用小字符串优化而非写时复制引用计数。
我决定检查它并编写了一个简单的程序:
注意,x.c_str()指针在x[0] = 'c'之后发生了变化。这意味着在写入时进行了内部缓冲区的复制。所以似乎COW仍在工作。为什么?
我在Ubuntu上使用g++ 5.1.0。
默认启用了std :: string的新实现,使用小字符串优化而非写时复制引用计数。
我决定检查它并编写了一个简单的程序:
int main()
{
std::string x{"blah"};
std::string y = x;
printf("0x%X\n", x.c_str());
printf("0x%X\n", y.c_str());
x[0] = 'c';
printf("0x%X\n", x.c_str());
printf("0x%X\n", y.c_str());
}
而结果是:
0x162FC38
0x162FC38
0x162FC68
0x162FC38
注意,x.c_str()指针在x[0] = 'c'之后发生了变化。这意味着在写入时进行了内部缓冲区的复制。所以似乎COW仍在工作。为什么?
我在Ubuntu上使用g++ 5.1.0。