নিম্নলিখিত স্নিপেট বিবেচনা করুন:
#include <array>
int main() {
using huge_type = std::array<char, 20*1024*1024>;
huge_type t;
}
স্পষ্টতই এটি বেশিরভাগ প্ল্যাটফর্মে ক্রাশ হবে কারণ ডিফল্ট স্ট্যাকের আকারটি সাধারণত 20MB এর চেয়ে কম থাকে।
এখন নিম্নলিখিত কোড বিবেচনা করুন:
#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
ব্যবহার হয়।