根據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正在使用)。 –