簡體   English   中英

為什么仍在GCC 5.1中啟用COW std :: string優化?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM