[英]Why is COW std::string optimization still enabled in GCC 5.1?
根據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。
一些發行版有意偏離FSF GCC的選擇,以默認為新的ABI。 這是為什么Fedora 22如此偏離上游GCC的解釋。 簡而言之:
在程序中,最好不要混合使用舊的和新的ABI,而要選擇一個並堅持下去。 如果程序的一部分假設一種類型的內部表示與程序的另一部分不同,則事情將中斷。
因此,如果使用了任何使用舊C ++ ABI的C ++庫,則使用該庫的程序也應使用舊C ++ ABI。
因此,如果使用了任何使用GCC 4.9或更早版本構建的C ++庫,則使用該庫的程序也應使用舊的C ++ ABI。
Fedora 22仍然提供(或提供了?)許多用GCC 4.9構建的庫,因為在Fedora 22發行之前沒有足夠的時間用GCC 5.1重建它們。 為了允許程序使用這些庫,GCC的默認設置已切換為舊的ABI。
據我所知,GCC 5尚未成為Ubuntu中的默認編譯器(但很快就會出現),因此,如果它作為額外的安裝提供,則Fedora中的相同論點也適用於Ubuntu。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.