vs下string為什麼不用Copy On Write技術

時間 2021-05-29 22:19:05

1樓:F001

C++11之後,STL裡面的string型別不允許使用 COW 技術實現,原因是這個:

Legality of COW std::string implementation in C++11

這個答案我在幾年前就見到了,好像知乎上前面幾個答主都沒提到這個問題。

如果用COW實現,那麼 non-const operator 可能會導致迭代器失效。而標準嚴格規定了哪些成員方法可以導致迭代器失效,其中不包括這個方法。示例如下:

std::string s("str");

const char* p = s.datastd::string s2(s); // COW 機制起作用

(void) s[0]; // 運算子會導致 s 需要複製乙份新的資料

// s2 析構掉,原先的記憶體空間被釋放

}std::cout << *p << '\n'; // p is dangling

2樓:zpan

gcc 現在也不用 COW 了,好像是因為 C++11 引入了乙個 API 使得用 COW 無法符合標準,具體哪個我忘了。

3樓:原子筆

多數時候,share 還是copy,哪個更好,是個很難權衡的問題。

通常認為,小塊記憶體copy好,大塊share好。 但是一般怎麼來定義,「大」和「小」呢?視你share的成本。有時候這個成本,常常被低估。

有乙個例子:

The Linux Kernel documentation核心和使用者態程式之間零拷貝傳輸資料,多好一件事情啊。。然而文件中也提到了,固定記憶體頁帶來的開銷,盤算下來只有在10K附近的記憶體大小比較划算。太小了,就經常不值當了。

4樓:歐文韜

因為要向前相容。而且gcc 5以後的小字串也不是COW的了。

而且《More Effective C++》裡說的不就是因為多執行緒坑,別用COW麼。

為什麼C語言沒有String型別?

封禁讓我戒乎 語言實現了String,開發者可以省心很多。比C早的Pascal就實現了String,C沒實現,應該是語言的設計者沒有預見到字串操作的頻密。我喜歡Delphi,字串操作方便也是原因之一。 王璐銘 從語言的抽象度角度來說,C是底層語言,他解決的問題一般位於機器模型空間。但是,String...

C 未包含 string 為什麼可使用string?

d41d8c 需要用到std ios base型別,std ios base有個成員類叫failure,std ios base failure有個建構函式接受std string 現在這被認為是個錯誤 我個人希望standard library module unit能消除這個問題。 馬小刀 編譯...

Java求教!為什麼我用String類下的split方法拆分乙個字串時裡面的引數不能是File separator?

Mr.justin path.toString split Matcher.quoteReplacement File.separator BrandonYang 解決辦法如下,原因是符號 在regex裡面是轉義字元,而取file.separator在Windows環境下就是字串 String pa...