【发布时间】:2015-07-05 08:39:58
【问题描述】:
根据 GCC 5 发布更改页面 (https://gcc.gnu.org/gcc-5/changes.html):
默认启用新的 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 兼容性。
-
你是对的。我用 -D _GLIBCXX_USE_CXX11_ABI 编译它,现在它按预期工作(没有 COW 也没有动态内存分配,所以很明显 SSO 正在使用中)。
标签: c++ string c++11 gcc copy-on-write