[問題] Optimization Memory Allocation的問題

看板C_and_CPP (C/C++)作者 (vbdcnj)時間14年前 (2011/10/29 14:31), 編輯推噓1(1012)
留言13則, 7人參與, 最新討論串1/1
舉例來說: 我用placement new 跟 operator new 寫一個stack push到stack 滿了後會自動reallocate兩倍的raw memory 但是我想說若是一直push push push 然後在一直pop pop pop,閒置raw會變很多 所以我是想說寫一個pop 版本的reallocate pop 完,"使用空間少於raw的一半就reallocate為一半空間" 可是若是剛好在那臨界值 一直循環push pop ,就會導致一直reallocate,很沒效率 所以要如何不讓閒置raw 過多,又能有效率 不知道各位版友有什麼建議?? 程式碼以下: 或是 http://codepad.org/fLbllV9O template<class T> class StackADT{ public: StackADT(int stackCapacity=10); StackADT& Push(const T &item); StackADT& Pop(); private: T *stack; int top; //目前元素的下一個位置 int capacity; void reallocate(); }; template<class T> StackADT<T>::StackADT(int stackCapacity) : capacity (stackCapacity){ stack = reinterpret_cast<T*>(operator new(sizeof(T)*capacity)); //raw top=0; } template<class T> StackADT<T>& StackADT<T>::Push(const T&item){ if(top==capacity){ cout<<"reallocate"<<endl; reallocate(); } new(stack+(top++))T(item); //placement new return *this; } template <class T> StackADT<T>& StackADT<T>::Pop(){ stack[--top].~T(); return *this; } template<class T> void StackADT<T>::reallocate(){ int size=top; int newcapacity=2*capacity; //配兩倍raw T* newstack=reinterpret_cast<T*>(operator new(sizeof(T)*newcapacity)); uninitialized_copy(stack,stack+top,newstack); for(int p=top;p!=0;) stack[--p].~T(); if(stack) //0指標 不可 operator delete(stack); stack=newstack; capacity=newcapacity; } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.115.213.250

10/29 14:38, , 1F
那就pop到剩四分之一的時候再rellocate吧
10/29 14:38, 1F

10/29 14:39, , 2F
反正realloc作完都是半滿 也沒有特別浪費空間
10/29 14:39, 2F

10/29 15:03, , 3F
增加一點緩衝吧,不要剛好少於一半就減少
10/29 15:03, 3F

10/29 15:32, , 4F
說的也是
10/29 15:32, 4F

10/29 15:38, , 5F
建議就是直接用STL... 疊在STL上仍然很有效率 XD
10/29 15:38, 5F

10/29 15:53, , 6F
樓上是指用 allocator 嗎? 還是直接用vector取代array
10/29 15:53, 6F

10/29 22:00, , 7F
這都是 case by case 的吧 ?
10/29 22:00, 7F

10/29 22:04, , 8F
不然就用 deque (或自己實做 deque )
10/29 22:04, 8F

10/29 22:47, , 9F
我記得我在學amortized analysis的時候是 滿的時候加倍
10/29 22:47, 9F

10/29 22:47, , 10F
四分之一的時候減半 @@
10/29 22:47, 10F

10/29 23:03, , 11F
amortized analysis 好像就是我要找的東西
10/29 23:03, 11F

10/29 23:03, , 12F
感謝樓上
10/29 23:03, 12F

10/30 04:12, , 13F
呃 原PO似乎搞錯了一件事 XD 那兩個英文字不是演算法 XD
10/30 04:12, 13F
文章代碼(AID): #1EgvtQNi (C_and_CPP)
文章代碼(AID): #1EgvtQNi (C_and_CPP)