2009-07-12 18 views
10

我的應用程序有內存問題,包括複製大量字符串,使用相同的字符串作爲許多哈希表中的鍵等。 m爲我的字符串尋找一個基類,這使得它非常高效。內存有效的C++字符串(內聯,繩索,寫時拷貝等)

我希望的:

  • 字符串實習(相同值的多個字符串使用相同的內存),
  • 寫入時複製(我認爲這免費的午餐,在幾乎所有性病::字符串實現),
  • 帶繩索的東西將是一個獎金(O(1) - 串聯)。

我的平臺是Linux上的g ++(但這不太可能)。

你知道這樣的圖書館嗎?

回答

5

如果大部分字符串都是不可變的,那麼Boost Flyweight庫可能適合您的需要。

它會做的字符串interning,但我不相信它在寫時複製。

+0

如果我用它來包裝一個std :: string,它看起來好像不會損害copy-on-write。 – 2009-07-12 13:37:59

9

寫入時複製(我認爲這免費的午餐,在幾乎所有的std :: string實現)

我不相信這種情況不再。通過迭代器修改字符串時,寫入時複製會導致問題:特別是,這會導致不需要的結果(即無副本,並且兩個字符串都被修改)或不必要的開銷(因爲迭代器不能純粹用指針:它們在被解除引用時需要執行額外的檢查)。

此外,所有現代C++編譯器都執行NRVO,並且在大多數情況下不需要複製返回值字符串。由於這是寫時複製語義的最常見情況之一,由於上述缺點,它已被刪除。

+4

更不用說多線程問題了...... – 2009-07-12 14:46:44

+2

此外,一些字符串有一個小的字符串優化,不是使用堆,而是使用嵌入式小緩衝區來存儲數據。令人驚訝的是,GCC的默認字符串類(libstdC++)在寫時複製。 – 2009-07-12 17:13:28

+1

C++ 11禁止COW字符串類 – Ghita 2013-06-07 12:13:59