সিপ্রেফারেন্স থেকে পছন্দটি উদ্ধৃতি:
এই রানটাইম পলিমারফিজমটি পলিমর্ফিক_অলোকেটর ব্যবহার করে এমন বস্তুগুলিকে এমন আচরণ করতে দেয় যেগুলি অভিন্ন স্ট্যাটিক বরাদ্দকারী প্রকার সত্ত্বেও তারা রান সময়ে বিভিন্ন বরাদ্দকারী প্রকারের ব্যবহার করে
"নিয়মিত" বরাদ্দকারীদের সমস্যা হ'ল তারা ধারকটির ধরণ পরিবর্তন করে। আপনি যদি vector
একটি নির্দিষ্ট বরাদ্দকারী সহ একটি চান , আপনি Allocator
টেমপ্লেট প্যারামিটার ব্যবহার করতে পারেন :
auto my_vector = std::vector<int,my_allocator>();
এখন সমস্যাটি হ'ল এই ভেক্টরটি ভিন্ন বরাদ্দকারী সহ ভেক্টরের মতো একই ধরণের নয়। আপনি এটি কোনও ফাংশনে এটি পাস করতে পারবেন না যার জন্য ডিফল্ট-বরাদ্দকারী ভেক্টর প্রয়োজন, উদাহরণস্বরূপ, বা একই ভেরিয়েবল / পয়েন্টারকে আলাদা বরাদ্দকারী টাইপের সাথে দুটি ভেক্টর বরাদ্দ করুন, যেমন:
auto my_vector = std::vector<int,my_allocator>();
auto my_vector2 = std::vector<int,other_allocator>();
auto vec = my_vector; // ok
vec = my_vector2; // error
পলিমারফিক বরাদ্দকারী হ'ল একক বরাদ্দকারী এমন একটি সদস্য যার সাথে টেমপ্লেট ব্যবস্থাটির পরিবর্তে গতিশীল প্রেরণের মাধ্যমে বরাদ্দকারীর আচরণকে সংজ্ঞায়িত করা যায়। এটি আপনাকে এমন পাত্রে রাখার অনুমতি দেয় যা নির্দিষ্ট, কাস্টমাইজড বরাদ্দ ব্যবহার করে তবে এটি এখনও সাধারণ ধরণের।
বরাদ্দকারীদের আচরণের অনুকূলিতকরণটি বরাদ্দকারীকে একটি দিয়ে দেওয়া হয় std::memory_resource *
:
// define allocation behaviour via a custom "memory_resource"
class my_memory_resource : public std::pmr::memory_resource { ... };
my_memory_resource mem_res;
auto my_vector = std::pmr::vector<int>(0, &mem_res);
// define a second memory resource
class other_memory_resource : public std::pmr::memory_resource { ... };
other_memory_resource mem_res_other;
auto my_other_vector = std::pmr::vector<int>(0, &mes_res_other);
auto vec = my_vector; // type is std::pmr::vector<int>
vec = my_other_vector; // this is ok -
// my_vector and my_other_vector have same type
মূল বাকী ইস্যুটি যেমনটি আমি দেখছি তা হ'ল একটি std::pmr::
ধারক এখনও std::
ডিফল্ট বরাদ্দকারী ব্যবহার করে সমতুল্য ধারকটির সাথে সামঞ্জস্য নয় । আপনি একটি ইন্টারফেস ডিজাইন করার সময় আপনাকে কিছু সিদ্ধান্ত নিতে হবে যা একটি ধারক নিয়ে কাজ করে:
- এটি সম্ভবত এমন যে ধারকটি পাস হয়েছে তাতে কাস্টম বরাদ্দের প্রয়োজন হতে পারে?
- যদি তা হয়, তবে আমি কি কোনও টেম্পলেট প্যারামিটার যুক্ত করব (স্বেচ্ছায় বরাদ্দকারীদের অনুমতি দেওয়ার জন্য) বা আমার পলিমারফিক বরাদ্দক ব্যবহারের আদেশ দিতে হবে?
একটি টেম্পলেট সমাধান পলিমারফিক বরাদ্দকারী সহ যেকোন বরাদ্দকারীকে অনুমতি দেয় তবে এর অন্যান্য ত্রুটি রয়েছে (উত্পন্ন কোডের আকার, সংকলনের সময়, কোড অবশ্যই হেডারে ফাইলে প্রকাশ করা উচিত, আরও "ধরণের দূষণের সম্ভাবনা" যা সমস্যাটিকে বহির্মুখী করে রাখে)। অন্যদিকে একটি পলিমারফিক বরাদ্দকৃত সলিউশন নির্দেশ দেয় যে একটি পলিমারফিক বরাদ্দকারী অবশ্যই ব্যবহার করা উচিত । এটি std::
পাত্রে ডিফল্ট বরাদ্দকারী ব্যবহার করে এমন পাতাগুলি ব্যবহার বন্ধ করে দেয় এবং লিগ্যাসি কোডের সাথে ইন্টারফেস করার জন্য এর অন্তর্ভুক্ত থাকতে পারে।
নিয়মিত বরাদ্দকারীর তুলনায় পলিমারফিক বরাদ্দকারীটির কিছু ছোটখাটো খরচ হয়, যেমন মেমরি_সোর্স পয়েন্টারের স্টোরেজ ওভারহেড (যা সম্ভবত সম্ভবত তুচ্ছ) এবং বরাদ্দকরণের জন্য ভার্চুয়াল ফাংশন প্রেরণের ব্যয়। মূল সমস্যাটি হ'ল সম্ভবত লিগ্যাসি কোডের সাথে সামঞ্জস্যের অভাব যা পলিমারফিক বরাদ্দ ব্যবহার করে না।
allocator<T>
সহজাতভাবে কিছু সমস্যা কাটিয়ে উঠার চেষ্টা করে । সুতরাং আপনি যদি ঘন ঘন বরাদ্দ ব্যবহার করেন তবে এর মান দেখতে পাবেন।