2012-05-28 118 views
4

當我看着std :: string在gcc中實現的方式時,我注意到sizeof(std :: string)正好等於指針的大小(4字節x32構建和x64的8個字節)。由於字符串應該持有一個指向字符串緩衝區的指針和它的長度作爲最小值,這讓我認爲GCC中的std :: string對象實際上是一個指向保存這些數據的內部結構的指針。GCC的std ::字符串 - 爲什麼這麼奇怪的執行

因此,當創建新字符串時,應該發生一個動態內存分配(即使字符串爲空)。

除了性能開銷,這也會導致內存開銷(當我們分配非常小的內存時會發生這種情況)。

所以我只看到這種設計的缺點。我錯過了什麼?這些實施的優勢是什麼?首先是什麼原因?

+2

對我自己來說,我通常會發現,編譯器和標準庫編寫者對我們的設計給予了更多的思考,這是一個安全的假設。我只是假設有很好的理由,直到我有一個可能由此造成的特定問題。現在,你可能會出於好奇而問。在這種情況下,我會建議你自己做更多的研究 - 源代碼和它的存儲庫就在那裏:) –

+3

GCC std :: string被實現爲copy-on-write智能指針,指向實際的緩衝區。它是開源的,所以你可以閱讀它。 –

+0

謝謝,Jan,應該自己找到了。請發表回覆,我會接受 –

回答

4

閱讀<bits/basic_string.h>頂部的長註釋,它解釋了指針指向的內容以及字符串長度(和引用計數)的存儲位置以及爲什麼這樣做。

但是,C++ 11不允許引用計數的寫時複製std::string,所以GCC實現將不得不改變,但這樣做會破壞ABI,因此被延遲直到ABI更改不可避免。我們不想改變ABI,然後幾個月後再次改變它,然後再改變它。當它改變時,應該只改變一次,以儘量減少用戶的麻煩。

+0

這方面的任何更新? ABI變化是否可預見?它可以有條件啓用嗎? –

+1

GCC 4.9可能會發生變化,並且僅在使用C++ 11時纔會生效 –