निम्नलिखित स्निपेट पर विचार करें:
#include <array>
int main() {
using huge_type = std::array<char, 20*1024*1024>;
huge_type t;
}
जाहिर है कि यह अधिकांश प्लेटफार्मों पर दुर्घटनाग्रस्त होगा, क्योंकि डिफ़ॉल्ट स्टैक का आकार आमतौर पर 20 एमबी से कम होता है।
अब निम्नलिखित कोड पर विचार करें:
#include <array>
#include <vector>
int main() {
using huge_type = std::array<char, 20*1024*1024>;
std::vector<huge_type> v(1);
}
हैरानी की बात यह है कि यह भी क्रैश! ट्रेसबैक (हाल के libstdc ++ संस्करणों में से एक के साथ) include/bits/stl_uninitialized.h
फ़ाइल की ओर जाता है , जहां हम निम्नलिखित पंक्तियों को देख सकते हैं:
typedef typename iterator_traits<_ForwardIterator>::value_type _ValueType;
std::fill(__first, __last, _ValueType());
रीसाइज़िंग vector
कंस्ट्रक्टर को तत्वों को डिफ़ॉल्ट-इनिशियलाइज़ करना होगा और इसी तरह इसे लागू किया जाता है। जाहिर है, _ValueType()
अस्थायी स्टैक को क्रैश करता है।
सवाल यह है कि क्या यह एक अनुरूप कार्यान्वयन है। यदि हाँ, तो वास्तव में इसका मतलब है कि विशाल प्रकार के वेक्टर का उपयोग काफी सीमित है, है ना?
std::allocator
का उपयोग किया जाता है।