मूल रूप से std::queue
एक एडाप्टर कंटेनर है - यह अपने आप से एक कंटेनर है, लेकिन अन्य कंटेनर चारों ओर एक पतली आवरण नहीं है।
उदाहरण के लिए, की सुविधा देता है कतार हस्ताक्षर पर एक नज़र डालें:
template <class T, class Container = deque<T> > class queue;
के रूप में आप देख सकते हैं, T
तत्व कतार में संग्रहीत के प्रकार है, और Container
अंतर्निहित कंटेनर है।
और इस अपने प्रश्न का उत्तर है: विभिन्न कंटेनरों स्मृति अलग तरह से संभालती है। अंतर्निहित डेक सिकुड़ सकता है या नहीं भी हो सकता है, लेकिन यह तय करने के लिए अंदर डेक पर निर्भर है।
आप अपने अंतर्निहित कंटेनर के रूप में std::list
उपयोग कर सकते हैं। इस मामले में, प्रत्येक पॉप अंतर्निहित सूची नोड मेमोरी हटा देता है।
आप अपने खुद के बारे में या मौजूदा कंटेनर अपनी खुद की स्मृति प्रबंधन पैटर्न मिलान करने के लिए संशोधित कर सकते हैं। आपके कंटेनर को कुछ तरीकों का समर्थन करने की आवश्यकता है (push_back
, pop_front
के रूप में चूसना) जिसे आप प्रासंगिक ऑनलाइन दस्तावेज़ में पढ़ सकते हैं।
यहाँ एक deque
एडाप्टर जो क्षमता में सिकुड़ता है के लिए एक उदाहरण हर 1024 pop
कॉल है:
template<class T>
class DequeAdapater{
private:
std::deque<T> m_Deque;
size_t m_PopCount;
public:
DequeAdapater():
m_PopCount(0){}
bool empty() const noexcept{
return m_Deque.empty();
}
size_t size() const noexcept{
return m_Deque.size();
}
T& front() noexcept{
return m_Deque.front();
}
const T& front()const noexcept{
return m_Deque.front();
}
T& back() noexcept{
return m_Deque.back();
}
const T& back()const noexcept{
return m_Deque.back();
}
void push_back(const T& t){
return m_Deque.push_back(t);
}
void push_back(T&& t){
return m_Deque.push_back(std::move(t));
}
void pop_front(){
m_Deque.pop_front();
m_PopCount++;
if (m_PopCount%1024U == 0U){
m_Deque.shrink_to_fit();
}
}
}
template <class T>
using LeanQueue = std::queue<T,DequeAdapater<T>>;
तथापि टिप्पणी करते हैं, क्षमता में सिकुड़ते जाने या नई दुबला हिस्सा करने के लिए कतार तत्वों को कॉपी, इसका मतलब है कि स्मृति खपत कम होगी, लेकिन प्रदर्शन खराब हो सकता है। जब कतार दायरे से बाहर चला जाता है
स्रोत
2016-07-05 08:37:44
यह भी पूरा मामला है कि यदि आप स्मृति को सी ++ (और, विस्तार से, सी) रनटाइम के रूप में मुक्त करते हैं, तो वह रनटाइम शायद इसे ओएस पर वापस नहीं देगा, इसलिए कार्यक्रम अभी तक उस स्मृति का उपभोग करें जहां तक ओएस का संबंध है। – Angew