簡體   English   中英

std :: string及其自動調整內存大小

[英]std::string and its automatic memory resizing

我對C ++很陌生,但我知道你不能像std :: string類那樣只使用內存似乎讓你這么做。 例如:

std::string f = "asdf";
f += "fdsa";

字符串類如何處理變得越來越大? 我假設它分配了一個默認的內存量,如果它需要更多,那么new的內存塊就會更大,並將自身復制到那個內存塊上。 但是,每次需要調整大小時,必須復制整個字符串並不是很低效嗎? 我真的不能想到可以做到的另一種方式(但顯然有人這樣做了)。

就此而言,所有stdlib類如vector,queue,stack等如何處理如此透明的增長和收縮?

你的分析是正確的-這低效的每一個它需要調整的時間復制字符串。 這就是為什么普通建議不鼓勵使用模式的原因。 使用字符串的reserve函數來要求它為您打算存儲在其中的內容分配足夠的內存。 然后進一步的操作將填補該內存。 (但如果你的提示結果太小,字符串也會自動增長。)

容器通常還會嘗試通過分配比他們需要的更多內存來減輕頻繁重新分配的影響。 一種常見的算法是,當字符串發現它沒有空間時,它會使其緩沖區大小加倍,而不是僅僅分配保存新值所需的最小值。 如果字符串一次生成一個字符,則此倍增算法會將時間復雜度降低到分攤的線性時間(而不是二次時間)。 它還降低了程序對內存碎片的敏感性。

通常,有一個加倍的算法。 換句話說,當它填充當前緩沖區時,它會分配一個兩倍大的新緩沖區,然后復制當前數據。 與單個分配塊增長的替代方案相比,這導致更少的分配/復制操作。

雖然我不知道std :: string的確切實現,但大多數需要處理動態內存增長的數據結構都是這樣做的 - 正如你所說的那樣 - 分配一個默認的內存量,如果需要更多,那么創建一個更大的塊並復制自己。

解決明顯的低效問題的方法是分配比你需要的更多的內存。 已用內存的比率:向量/字符串/列表/等的總內存通常稱為加載因子 (也用於略有不同含義的哈希表)。 通常它是1:2的比例 - 也就是說,你分配兩倍於你需要的內存。 當空間不足時,您可以為當前數量分配兩倍的新內存並使用它。 這意味着隨着時間的推移,如果你繼續向vector / string / etc添加東西,你需要越來越少地復制項目(因為內存創建是指數級的,你插入的新項目當然是線性的),所以這種內存處理方法所用的時間並不像你想象的那么大。 根據攤銷分析的原則,您可以看到使用此方法將m項目插入向量/字符串/列表只是m的Big-Theta,而不是m 2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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