Re: [問題] 同時間需要大量delete的狀況

看板C_and_CPP作者 (單身老王)時間12年前 (2013/07/04 15:46), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串2/4 (看更多)
※ 引述《xtxml (赤木巧☠)》之銘言: : 目前兩個方式: : 1.之前的做法會是,寫一個manager來把這些資料收集起來,延遲刪除。 其實既然都要刪除,Manager 跟有無延遲刪除關聯並不大; : 2.而我想自製一個memory allocator類別,給裝node的容器使用,他的行為是: : (1)批量的向系統要記憶體,一次可能要100或1000個node的大小, : 然後慢慢分配給容器使用,用完再要一個批量。 : (2)容器要求deallocate的時候不做事,只確保做完解構。 : (因為記憶體不重複使用,最後會一次刪,所以不一一處理deallocate) : (3)等全部的node要一起刪除的話,就把批次要來的記憶體釋放掉, : 可以大量減少delete的次數。 這種做法,STL本身其實就有;但STL的大小判別標準我並不是很清楚,建議是查 書比較好。比方說侯捷有針對 STL 的源碼剖析、還有像是EffectC++跟MEC++都有 相關內容,只是到底在哪本我就忘了。 下文述說。 : 想請教一下: : 一.這樣的問題有沒有更合適的處理方式?方法1.或方法2.哪一個好一點。 其實都不好,new 在 memory allocation 屬於 HEAP-BASED ALLOCATION ,效能會 比較不好。再者,你所謂的同時刪除、同時新增,也不一定是指全體、如此一來就 會有 fragment,除非你的資料大小全部都統一。 : 二.關於方法2.目前想到就是要謹慎使用,並且包裝好確保會安全的刪除, : 不知道有沒有什麼我沒有考慮到的缺點,或者不推薦這樣做的理由。 : 還請各位指教,感謝。 這不用太過擔心,除非運用雙重指標或複雜的資料結構、解構式寫好,基本上不會 有太大的問題。 至於新增、刪除的時間成本,你可以參照資料結構(in C++)聖經本第二版第 197 頁, 他採用了一種 AVALIABLE SPACE LISTS 的資料結構,讓刪除總體資料的時間複雜度 降低至常數時間。 無論你現在採用的資料結構是不是 LINKED LIST,這都帶有啟發性; 因為對於資料的存取,其實建立在記憶體的位置上;也就說要對該記憶體有識別性, 你才能知道你正在讀取有意義的資料。 所以 SORT 可以只針對 POINTER 進行調換,而非對資料本身進行搬移; 這點在刪除上也是相同的,不用對原本的資料進行刪除、而是對指標進行改寫,像是 STACK-BASED ALLOCATION,你甚至不必「真的」去刪除他,而是將TOP直接置底。 當然,如果你的資料結構不適用這個方法,那就要另尋方法了。 還有很多的記憶體配置技術,我認識的也只有這些了; 當中如果有錯,請板友們指正,感謝<(_ _)> -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.134.36.214 ※ 編輯: bachelorwhc 來自: 220.134.36.214 (07/04 23:48)

07/05 00:09, , 1F
相當感謝您的回應:) 讓我解決了問題還學到了很多
07/05 00:09, 1F
文章代碼(AID): #1HrPZ5Pi (C_and_CPP)
文章代碼(AID): #1HrPZ5Pi (C_and_CPP)