এটি আসলে কোনও ধরণের ডেটা স্ট্রাকচার বাস্তবায়নের জন্য প্রয়োজনীয় যা sertedোকানো উপাদানগুলির সংখ্যার জন্য ন্যূনতম প্রয়োজনের চেয়ে বেশি মেমরি বরাদ্দ করে (যেমন, কোনও সময়ে কোনও নোড বরাদ্দকৃত লিঙ্কযুক্ত কাঠামো ছাড়া অন্য কিছু)।
নিন পাত্রে পছন্দ unordered_map
, vector
অথবা deque
। প্রতিটি একক সন্নিবেশের জন্য একটি গাদা বরাদ্দ প্রয়োজন এড়াতে এগুলি এখন পর্যন্ত যে উপাদানগুলি আপনি inোকালেন তার জন্য ন্যূনতমভাবে প্রয়োজনীয় মেমরির পরিমাণ বেশি বরাদ্দ করে। চলুন ব্যবহার করা যাকvector
সহজ উদাহরণ হিসাবে করা ।
যখন তুমি কর:
vector<Foo> vec;
// Allocate memory for a thousand Foos:
vec.reserve(1000);
... এটি আসলে হাজার হাজার ফুস তৈরি করে না। এটি কেবল তাদের জন্য মেমরির বরাদ্দ / সংরক্ষণ করে। যদি vector
এখানে प्लेসমেন্ট নতুন ব্যবহার না করা হয় তবে এটি ডিফল্ট-নির্মাণ হবেFoos
পুরো জায়গা জুড়ে পাশাপাশি তাদের ধ্বংসকারীদের অনুরোধ করতে হবে এমনকি এমন উপাদানগুলির জন্য এমনকি আপনি প্রথম স্থানে প্রবেশ করেননি।
বরাদ্দ! = নির্মাণ, বিনামূল্যে! = ধ্বংস
উপরের মতো অনেকগুলি ডেটা স্ট্রাকচার বাস্তবায়নের জন্য সাধারণভাবে বলতে গেলে, আপনি মেমরি বরাদ্দকরণ এবং উপাদানগুলি একটি অবিভাজ্য জিনিস হিসাবে নির্ধারণ করতে পারবেন না এবং আপনি একইভাবে মেমরি মুক্ত করে এবং উপাদানগুলিকে একটি অবিভাজ্য জিনিস হিসাবে চিকিত্সা করতে পারবেন না।
অযৌক্তিকভাবে বাম এবং ডানদিকে অতিমাত্রায় আহ্বানকারী কনস্ট্রাক্টর এবং ডেস্ট্রাক্টরদের এড়াতে এই ধারণাগুলির মধ্যে পৃথকীকরণ করতে হবে এবং এজন্যই স্ট্যান্ডার্ড লাইব্রেরি এই ধারণাটিকে পৃথক করে std::allocator
(যা মেমরি * বরাদ্দ / মুক্ত করার সময় উপাদানগুলি নির্মাণ বা ধ্বংস করে না) থেকে দূরে থাকে from যে পাত্রে এটি ব্যবহার করা হয় সেগুলি প্ল্যাসমেন্ট নতুন ব্যবহার করে ম্যানুয়ালি উপাদান তৈরি করে এবং ডিস্ট্রাক্টরের স্পষ্ট আহবান ব্যবহার করে উপাদানগুলিকে ম্যানুয়ালি নষ্ট করে।
- আমি এর নকশাকে ঘৃণা করি
std::allocator
তবে এটি আলাদা বিষয় আমি রেটিং এড়ানো এড়াতে চাই। :-D
যাইহোক যাইহোক, আমি এটি প্রচুর ব্যবহার করার প্রবণতা রেখেছি যেহেতু আমি প্রচলিত সাধারণ উদ্দেশ্যগুলির সাথে সম্মতিযুক্ত সি +++ ধারক লিখেছি যা বিদ্যমানগুলির ক্ষেত্রে তৈরি করা যায়নি। এর মধ্যে অন্তর্ভুক্ত একটি ছোট ভেক্টর বাস্তবায়ন যা আমি বেশ কয়েক দশক আগে সাধারণ ক্ষেত্রে গাদা বরাদ্দ এড়াতে এবং মেমরি-দক্ষ ট্রাই (একসাথে একটি নোড বরাদ্দ করে না) তৈরি করেছিলাম। উভয় ক্ষেত্রেই আমি বিদ্যমান পাত্রে ব্যবহার করে সত্যই এগুলিকে বাস্তবায়ন করতে পারিনি, এবং তাই placement new
অপ্রয়োজনীয় বাম এবং ডান জিনিসগুলিতে অতিমাত্রায় কন্সট্রাক্টর এবং ডেস্ট্রাক্টরদের এড়াতে আমাকে ব্যবহার করতে হয়েছিল।
স্বাভাবিকভাবেই যদি আপনি কাস্টম বরাদ্দকারীদের সাথে নিখরচায় পৃথকভাবে অবজেক্টগুলিকে বরাদ্দ দেওয়ার জন্য কাজ করেন, তবে আপনি সাধারণত placement new
এটির মতো ব্যবহার করতে চান (ব্যতিক্রমী-সুরক্ষা বা আরআইআইআই-তে বিরক্ত করে না এমন মৌলিক উদাহরণ):
Foo* foo = new(free_list.allocate()) Foo(...);
...
foo->~Foo();
free_list.free(foo);