根据GCC 5的发布改变了页面(https://gcc.gnu.org/gcc-5/changes.html):为什么COW std :: string优化在GCC 5.1中仍然可用?
的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。
我想你的发行版上的gcc的配置与默认配置不同,以保持ABI兼容性。 – inf
你说得对。我用-D _GLIBCXX_USE_CXX11_ABI编译它,现在按预期工作(没有COW和动态内存分配,所以显然SSO正在使用)。 –