[問題] Optimization Memory Allocation的問題
舉例來說:
我用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
10/29 14:38, 1F
→
10/29 14:39, , 2F
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
10/29 15:38, 5F
→
10/29 15:53, , 6F
10/29 15:53, 6F
→
10/29 22:00, , 7F
10/29 22:00, 7F
→
10/29 22:04, , 8F
10/29 22:04, 8F
→
10/29 22:47, , 9F
10/29 22:47, 9F
→
10/29 22:47, , 10F
10/29 22:47, 10F
→
10/29 23:03, , 11F
10/29 23:03, 11F
→
10/29 23:03, , 12F
10/29 23:03, 12F
推
10/30 04:12, , 13F
10/30 04:12, 13F
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章