গতিশীল মেমরি বরাদ্দ এবং মেমরি পরিচালনা


17

একটি গড় খেলায়, দৃশ্যে কয়েকশ বা সম্ভবত কয়েক হাজার বস্তু রয়েছে। গতিশীলভাবে ডিফল্ট নতুন () এর মাধ্যমে বন্দুকের গুলি (গুলি) সহ সমস্ত বস্তুর জন্য মেমরি বরাদ্দ করা কি সম্পূর্ণ সঠিক ?

গতিশীল বরাদ্দের জন্য কি আমার কোনও মেমরি পুল তৈরি করা উচিত , বা এটি নিয়ে কোনও মাথা ঘামানোর দরকার নেই? লক্ষ্য প্ল্যাটফর্ম যদি মোবাইল ডিভাইস হয়?

কোনও মোবাইল গেমটিতে কোনও মেমরি পরিচালকের দরকার আছে , দয়া করে? ধন্যবাদ.

ভাষা ব্যবহৃত: সি ++; বর্তমানে উইন্ডোজ অধীনে বিকাশ, কিন্তু পরে পোর্ট করা পরিকল্পনা।


কোন ভাষা?
কাইলোটান

@ কাইলোটান: ব্যবহৃত ভাষা: সি ++ বর্তমানে উইন্ডোজের অধীনে বিকাশিত হয়েছে তবে পরে পোর্ট করার পরিকল্পনা রয়েছে।
বুনকাই.সেটেরি

উত্তর:


23

একটি গড় গেমটিতে, দৃশ্যে শত শত বা সম্ভবত কয়েক হাজার পর্যবেক্ষক রয়েছে। গতিশীলভাবে ডিফল্ট নতুন () এর মাধ্যমে বন্দুক শট (বুলেট) অন্তর্ভুক্ত সমস্ত বস্তুর জন্য মেমরি বরাদ্দ করা কি সম্পূর্ণ সঠিক?

এটি "সঠিক" দ্বারা আপনি কী বোঝাতে চেয়েছেন তা সত্যই নির্ভর করে। আপনি যদি শব্দটি বেশ আক্ষরিকভাবে গ্রহণ করেন (এবং অন্তর্নিহিত ডিজাইনের সঠিকতার কোনও ধারণা উপেক্ষা করেন) তবে হ্যাঁ, এটি পুরোপুরি গ্রহণযোগ্য। আপনার প্রোগ্রাম সংকলন এবং জরিমানা চলবে।

এটি উপ-অনুকূলভাবে পারফরম্যান্স করতে পারে তবে এটি এখনও একটি শিপযোগ্য, মজাদার খেলা হওয়ার জন্য যথেষ্ট ভাল পারফর্ম করতে পারে।

গতিশীল বরাদ্দের জন্য কি আমার কোনও মেমরি পুল তৈরি করা উচিত, বা এটি নিয়ে কোনও মাথা ঘামানোর দরকার নেই? লক্ষ্য প্ল্যাটফর্ম যদি মোবাইল ডিভাইস হয়?

প্রোফাইল এবং দেখুন। সি ++ এ, উদাহরণস্বরূপ, গাদাতে গতিশীলভাবে বরাদ্দকরণ সাধারণত একটি "ধীর" অপারেশন হয় (এর মধ্যে এটি উপযুক্ত আকারের একটি ব্লকের সন্ধানে গাদা দিয়ে হাঁটা জড়িত)। সি # তে এটি সাধারণত একটি অত্যন্ত দ্রুত অপারেশন হয় কারণ এতে বর্ধনের চেয়ে কিছুটা বেশি জড়িত invol বিভিন্ন ভাষা প্রয়োগে মেমরি বরাদ্দ, মুক্তির উপর বিভাজন এবং অন্যান্য বিষয়গুলির সাথে বিভিন্ন পারফরম্যান্স বৈশিষ্ট্য রয়েছে।

একটি মেমরি পুলিং সিস্টেম প্রয়োগ করা অবশ্যই কার্যকারিতা লাভ করতে পারে - এবং যেহেতু মোবাইল সিস্টেমগুলি সাধারণত ডেস্কটপ সিস্টেমের তুলনায় আন্ডার পাওয়ারযুক্ত হয়, তাই আপনি কোনও ডেস্কটপে যাবেন তার চেয়ে কোনও নির্দিষ্ট মোবাইল প্ল্যাটফর্মে আরও বেশি লাভ দেখতে পাবেন। তবে আবার আপনাকে প্রোফাইল দেখতে হবে এবং দেখতে হবে - যদি বর্তমানে আপনার গেমটি ধীর গতিতে থাকে তবে মেমরির বরাদ্দ / মেমরির বরাদ্দ অনুকূলিতকরণের জন্য অবকাঠামো বাস্তবায়িত করে সম্ভবত মেমরি বরাদ্দ / প্রকাশটি একটি গরম জায়গা হিসাবে প্রদর্শিত হয় না ' আপনার বকসের জন্য আপনাকে অনেক ধাক্কা দেবে না

কোনও মোবাইল গেমটিতে কোনও মেমরি পরিচালকের দরকার আছে, দয়া করে? ধন্যবাদ.

আবার, প্রোফাইল এবং দেখুন। আপনার খেলা এখন ভাল চলছে? তাহলে আপনার চিন্তা করার দরকার নেই।

এই সমস্ত সতর্কতা-কথা বলুন, সমস্ত কিছুর জন্য গতিশীল বরাদ্দ ব্যবহার করা কঠোরভাবে প্রয়োজনীয় কথা বলছে না এবং তাই এটি এড়ানো সুবিধাজনক হতে পারে - সম্ভাব্য পারফরম্যান্স লাভের কারণে এবং মেমরি বরাদ্দ করার জন্য যা আপনাকে ট্র্যাক করতে হবে এবং অবশেষে প্রকাশ করা দরকার এর অর্থ আপনাকে সম্ভবত ট্র্যাক করে অবশেষে ছেড়ে দিতে হবে, সম্ভবত আপনার কোডটিকে জটিল করে তুলবে।

বিশেষত, আপনার মূল উদাহরণে আপনি "বুলেটগুলি" উদ্ধৃত করেছেন যা এমন একটি জিনিস যা ঘন ঘন তৈরি এবং ধ্বংস হয়ে যায় - কারণ অনেক গেমগুলিতে প্রচুর গুলি জড়িত থাকে, এবং বুলেটগুলি দ্রুত চলে এবং এইভাবে তাদের জীবনকালের শেষে দ্রুত পৌঁছে যায় (এবং প্রায়শই আবেগপূর্নভাবে!)। সুতরাং তাদের জন্য একটি পুল বরাদ্দকারী কার্যকর করা এবং তাদের মতো বস্তুগুলি (যেমন একটি কণা সিস্টেমের কণাগুলি) সাধারণত দক্ষতা লাভের কারণ হতে পারে এবং পুল বরাদ্দ ব্যবহারের দিকে তাকাতে প্রথম স্থান হতে পারে।

আপনি যদি কোনও মেমরি পুল বাস্তবায়নকে "মেমরি পরিচালক" থেকে আলাদা হিসাবে বিবেচনা করেন তবে আমি অস্পষ্ট - একটি মেমরি পুল একটি তুলনামূলকভাবে সু-সংজ্ঞায়িত ধারণা, তাই আমি কিছুটা দৃty়তার সাথে বলতে পারি যে আপনি যদি এটি প্রয়োগ করেন তবে তারা কোনও উপকার হতে পারে । একজন "মেমোরি ম্যানেজার" তার দায়িত্বের দিক থেকে কিছুটা অস্পষ্ট, সুতরাং আমাকে বলতে হবে যে "মেমরি ম্যানেজার" কী করবে আপনি কী ভাবেন তার উপর নির্ভর করে যে কোনওর প্রয়োজন হয় কিনা।

উদাহরণস্বরূপ, আপনি যদি মেমোরি ম্যানেজারকে এমন একটি জিনিস হিসাবে বিবেচনা করেন যা কেবল নতুন / মুছে ফেলা / ফ্রি / ম্যালোক / যাই হোক না কেন কলগুলিতে বাধা দেয় এবং আপনি কতটা মেমরি বরাদ্দ করেন, আপনি কী ফাঁস করেন এবং এটিকে পরীক্ষা করে তা নির্ণয় সরবরাহ করে - তবে এটি কার্যকর হতে পারে গেমটির বিকাশ চলাকালীন এটি আপনাকে লিকটি ডিবাগ করতে এবং আপনার সর্বোত্তম মেমরি পুলের মাপের টিউন করতে সহায়তা করে।


একমত। এমন একটি কোড কোড যা আপনাকে পরে জিনিসগুলি পরিবর্তন করতে দেয়। সন্দেহ হলে, বেঞ্চমার্ক বা প্রোফাইল।
axel22

@ জোশ: চমৎকার উত্তরের জন্য +1। আমার সম্ভবত যা দরকার তা হ'ল গতিশীল বরাদ্দ, স্ট্যাটিক বরাদ্দ এবং মেমরি পুলগুলির সংমিশ্রণ। তবে গেমের পারফরম্যান্স আমাকে এই তিনজনের সঠিক মিশ্রণে গাইড করবে। এটি আমার প্রশ্নের স্বীকৃত উত্তরের স্বতন্ত্র প্রার্থী । তবে অন্যেরা কী কী অবদান রাখবে তা দেখার জন্য আমি এই প্রশ্নটি কিছু সময়ের জন্য উন্মুক্ত রাখতে চাই।
বুঙ্কাই.সেটেরি

+1 টি। দুর্দান্ত বিবরণ। প্রায় প্রতিটি কার্য সম্পাদনের প্রশ্নের উত্তর সর্বদা "প্রোফাইল এবং দেখুন"। প্রথম নীতিগুলি থেকে পারফরম্যান্স সম্পর্কে যুক্তি জানাতে আজকাল হার্ডওয়্যার খুব জটিল। আপনার ডেটা দরকার।
উপুড়হস্ত

@ দক্ষ: আপনার মন্তব্যের জন্য ধন্যবাদ। তাই লক্ষ্যটি গেমটি তৈরি করে কাজ করছে al উন্নয়নের মাঝামাঝি সময়ে পারফরম্যান্স নিয়ে খুব বেশি চিন্তা করার দরকার নেই। এগুলি সবই গেম সমাপ্তির পরে ঠিক হয়ে যাবে।
বুনকাই.সেটেরি

আমি মনে করি এটি সি # এর বরাদ্দের সময়গুলির একটি অনুপযুক্ত উপস্থাপনা - উদাহরণস্বরূপ, প্রতিটি সি # বরাদ্দে একটি সিঙ্ক ব্লক, অবজেক্টের বরাদ্দ ইত্যাদিরও অন্তর্ভুক্ত থাকে C এছাড়াও, সি ++ এর গাদা কেবলমাত্র বরাদ্দকরণ এবং জমা দেওয়ার সময় পরিবর্তনের প্রয়োজন হয়, যেখানে সি # সংগ্রহের প্রয়োজন ।
ডেডএমজি

7

জোশের দুর্দান্ত উত্তরে আমার তেমন যোগ করার দরকার নেই, তবে আমি এ সম্পর্কে মন্তব্য করব:

গতিশীল বরাদ্দের জন্য কি আমার কোনও মেমরি পুল তৈরি করা উচিত, বা এটি নিয়ে কোনও মাথা ঘামানোর দরকার নেই?

মেমরি পুল এবং newপ্রতিটি বরাদ্দকে আহ্বানের মধ্যে একটি মাঝারি ক্ষেত্র রয়েছে । উদাহরণস্বরূপ, আপনি কোনও অ্যারেতে সেট সংখ্যা সংখ্যক বরাদ্দ করতে পারেন, তারপরে তাদের 'ধ্বংস' করতে একটি পতাকা সেট করুন। যখন আপনাকে আরও বরাদ্দ দেওয়ার দরকার হয়, আপনি ধ্বংস হওয়া পতাকা সেট দিয়ে ওভাররাইট করতে পারেন। নতুন / মুছার চেয়ে এই ধরণের জিনিসটি ব্যবহার করা কেবল সামান্য জটিল (কারণ সেই উদ্দেশ্যে আপনার 2 টি নতুন ফাংশন থাকবে) তবে এটি লিখতে সহজ এবং আপনাকে বড় লাভ দিতে পারে।


সুন্দর সংযোজনের জন্য +1। হ্যাঁ, আপনি ঠিক বলেছেন, গেমসের সহজ উপাদানগুলি যেমন: গুলি, কণা, প্রভাবগুলি পরিচালনা করার জন্য এটি একটি ভাল উপায়। বিশেষত তাদের জন্য, গতিশীলভাবে মেমরি বরাদ্দ করার প্রয়োজন হবে না।
বুনকাই.সেটেরি

3

গতিশীলভাবে ডিফল্ট নতুন () এর মাধ্যমে বন্দুকের গুলি (গুলি) সহ সমস্ত বস্তুর জন্য মেমরি বরাদ্দ করা কি সম্পূর্ণ সঠিক?

না অবশ্যই না. কোনও বস্তুর জন্য কোনও মেমরি বরাদ্দ সঠিক নয় । অপারেটর নতুন () এর জন্য গতিশীল বরাদ্দের জন্য, অর্থাত্‍ যদি আপনার প্রয়োজন বরাদ্দকে গতিশীল করার প্রয়োজন হয় তবেই বস্তুর জীবনকাল গতিশীল বা কারণ বস্তুর ধরণ গতিশীল। যদি অবজেক্টের ধরণ এবং আজীবন স্থিরভাবে জানা থাকে তবে আপনার এটি স্ট্যাটিকালি বরাদ্দ করা উচিত।

অবশ্যই, আপনার বরাদ্দ নিদর্শন সম্পর্কে আপনার কাছে যত বেশি তথ্য রয়েছে, বিশেষজ্ঞ বরাদ্দকারী যেমন বস্তুর পুলগুলির মাধ্যমে এই বরাদ্দগুলি তত দ্রুত করা যায়। তবে, এগুলি অপ্টিমাইজেশন এবং সেগুলি প্রয়োজনীয় হিসাবে পরিচিত হলে আপনার কেবল সেগুলি করা উচিত।


ভাল উত্তরের জন্য +1। সুতরাং সাধারণীকরণের জন্য, সঠিক পদ্ধতিটি হ'ল: বিকাশের শুরুতে, পরিকল্পনা করা, কোন বস্তুগুলি স্থিতিশীলভাবে বরাদ্দ করা যেতে পারে। বিকাশের সময়, গতিশীলভাবে বরাদ্দ করতে কেবল সেই বস্তুগুলিকে গতিশীলভাবে বরাদ্দ করতে হয়। শেষে, প্রোফাইল করতে এবং সম্ভাব্য মেমরি বরাদ্দ কার্য সম্পাদনের সমস্যাগুলি সামঞ্জস্য করুন।
বুনকাই.সেটেরি

0

কাইলোটনের পরামর্শ প্রতিধ্বনি দেওয়ার মতো তবে আমি এটির পরামর্শ দেওয়ার সময় ডাটা কাঠামো স্তরে সমাধান করার পরামর্শ দিচ্ছি, আপনি যদি সহায়তা করতে পারেন তবে নিম্ন বরাদ্দ স্তরে নয়।

আপনি কীভাবে Foosবারবার সংযুক্ত উপাদানগুলির সাথে গর্তযুক্ত একটি অ্যারে ব্যবহার করে বারবার বরাদ্দ দেওয়া এবং মুক্ত করা এড়াতে পারবেন তার একটি সাধারণ উদাহরণ ("বরাদ্দকারী" স্তরের পরিবর্তে "ধারক" স্তরে এটি সমাধান করা):

struct FooNode
{
    explicit FooNode(const Foo& ielement): element(ielement), next(-1) {}

    // Stores a 'Foo'.
    Foo element;

    // Points to the next foo available; either the
    // next used foo or the next deleted foo. Can
    // use SoA and hoist this out if Foo doesn't 
    // have 32-bit alignment.
    int next;
};

struct Foos
{
    // Stores all the Foo nodes.
    vector<FooNode> nodes;

    // Points to the first used node.
    int first_node;

    // Points to the first free node.
    int free_node;

    Foos(): first_node(-1), free_node(-1)
    {
    }

    const FooNode& operator[](int n) const
    {
         return data[n];
    }

    void insert(const Foo& element)
    {
         int index = free_node;
         if (index != -1)
         {
              // If there's a free node available,
              // pop it from the free list, overwrite it,
              // and push it to the used list.
              free_node = data[index].next;
              data[index].next = first_node;
              data[index].element = element;
              first_node = index;
         }
         else
         {
              // If there's no free node available, add a 
              // new node and push it to the used list.
              FooNode new_node(element);
              new_node.next = first_node;
              first_node = data.size() - 1;
              data.push_back(new_node);
         }
    }

    void erase(int n)
    {
         // If the node being removed is the first used
         // node, pop it from the used list.
         if (first_node == n)
              first_node = data[n].next;

         // Push the node to the free list.
         data[n].next = free_node;
         free_node = n;
    }
};

এই প্রভাবটির কিছু: একটি নিখরচায় তালিকা সহ একক-সংযুক্ত সূচক তালিকা। সূচী লিঙ্কগুলি আপনাকে মুছে ফেলা উপাদানগুলিকে ছাড়তে দেয়, ধ্রুবক সময়ে উপাদানগুলি সরিয়ে দেয় এবং ধ্রুবক-সময় সন্নিবেশ সহ ফ্রি উপাদানগুলি পুনরায় দাবি / পুনঃব্যবহার / ওভাররাইট করতে পারে। কাঠামোর মাধ্যমে পুনরাবৃত্তি করতে, আপনি এরকম কিছু করুন:

for (int index = foos.first_node; index != -1; index = foos[index].next)
    // do something with foos[index]

এখানে চিত্র বর্ণনা লিখুন

এবং আপনি উপরের ধরণের "গর্তের সংযুক্ত অ্যারে" টেমপ্লেটগুলি ব্যবহার করে ডেটা স্ট্রাকচারকে সাধারণকরণ করতে পারেন, অনুলিপি বরাদ্দকরণের প্রয়োজনীয়তা এড়াতে নতুন বসানো এবং ম্যানুয়াল ডেটর অনুরোধ করতে পারেন, উপাদানগুলি সরিয়ে ফেলা হলে এটি ধ্বংসকারীদের ডাকতে পারেন, একটি ফরোয়ার্ড পুনরাবৃত্তি প্রদান করে I উদাহরণটি খুব সি-জাতীয় পছন্দটি ধারণাকে আরও স্পষ্টভাবে চিত্রিত করার জন্য রেখেছি এবং কারণ আমি খুব অলস।

এটি বলেছিল, আপনি মাঝখানে থেকে অনেকগুলি সরিয়ে এবং সন্নিবেশ করার পরে এই কাঠামোটি স্থানীয় অঞ্চলে হ্রাস পেতে থাকে। সেই মুহুর্তে nextলিঙ্কগুলি আপনাকে ভেক্টর ধরে সামনে এবং পিছনে হাঁটা করতে পারে, একই ক্রমবর্ধমান ট্র্যাভারসালের মধ্যে ক্যাশে লাইন থেকে পূর্বে নিষ্ক্রিয় করা ডেটা পুনরায় লোড করা যেতে পারে (এটি কোনও ডেটা স্ট্রাকচার বা বরাদ্দকারীর সাথে অনিবার্য যা পুনরায় দাবি করার সময় উপাদানগুলি পরিবর্তন না করে স্থির-সময় অপসারণের অনুমতি দেয়) ধ্রুবক-সময় সন্নিবেশ এবং সমান্তরাল বিটসেট বা removedপতাকা হিসাবে কিছু ব্যবহার না করে মধ্য থেকে ফাঁকা স্থান । ক্যাশে-বন্ধুত্ব পুনরুদ্ধার করতে, আপনি এইভাবে একটি অনুলিপি কর্টর এবং অদলবদল প্রয়োগ করতে পারেন:

Foos(const Foos& other)
{
    for (int index = other.first_node; index != -1; index = other[index].next)
        insert(foos[index].element);
}

void Foos::swap(Foos& other)
{
     nodes.swap(other.nodes):
     std::swap(first_node, other.first_node);
     std::swap(free_node, other.free_node);
}

// ... then just copy and swap:
Foos(foos).swap(foos);

এখন নতুন সংস্করণটি ক্র্যাশ করতে আবার ক্যাশে-বান্ধব। আর একটি পদ্ধতি হ'ল কাঠামোর মধ্যে সূচকের পৃথক তালিকা সঞ্চয় করে এবং পর্যায়ক্রমে সেগুলি সাজান। অন্যটি হ'ল কোন সূচকগুলি ব্যবহৃত হয় তা নির্দেশ করতে একটি বিটসেট ব্যবহার করা। এটি সর্বদা আপনার ক্রমবর্ধমান ক্রমে বিটসেটটি অতিক্রম করবে (দক্ষতার সাথে এটি করার জন্য, একবারে 64৪-বিটগুলি দেখুন যেমন এফএফএস / এফএফজেড ব্যবহার করে)। বিটসেটটি সর্বাধিক দক্ষ এবং অ-অনুপ্রবেশকারী, কোনটি ব্যবহৃত হয় এবং কোনটি 32-বিটের প্রয়োজনের পরিবর্তে অপসারণ করা হয় তা নির্দেশ করার জন্য উপাদানটির প্রতি মাত্র একটি সমান্তরাল বিটের প্রয়োজনnext সূচকগুলির , তবে ভাল লেখার জন্য সবচেয়ে সময়সাপেক্ষ (এটি হবে না) ট্র্যাভারসালের জন্য দ্রুত হন যদি আপনি একবারে কিছুটা পরীক্ষা করে দেখেন - অধিকৃত সূচকগুলির ব্যাপ্তিগুলি দ্রুত নির্ধারণ করার জন্য আপনাকে 32+ বিটের মধ্যে অবিলম্বে একটি সেট বা আনসেট বিট খুঁজে পেতে এফএফএস / এফএফজেডের দরকার হয়)।

এই লিঙ্কযুক্ত সমাধানটি কার্যকরভাবে প্রয়োগ করা সবচেয়ে সহজ এবং অ-হস্তক্ষেপ ( Fooকিছু removedপতাকা সংরক্ষণের জন্য সংশোধন করার প্রয়োজন হয় না ) যা আপনি যদি 32-বিটকে কিছু মনে করেন না তবে কোনও ডাটা টাইপের সাথে কাজ করার জন্য এই ধারকটিকে সাধারণীকরণ করতে চাইলে সহায়ক helpful উপাদান প্রতি ওভারহেড

গতিশীল বরাদ্দের জন্য কি আমার কোনও মেমরি পুল তৈরি করা উচিত, বা এটি নিয়ে কোনও মাথা ঘামানোর দরকার নেই? লক্ষ্য প্ল্যাটফর্মটি যদি মোবাইল ডিভাইস হয়?

প্রয়োজন একটি শক্ত শব্দ এবং আমি রাইক্র্যাকিং, চিত্র প্রক্রিয়াকরণ, কণা সিমুলেশন এবং জাল প্রসেসিংয়ের মতো খুব কার্য সম্পাদন-সমালোচনামূলক ক্ষেত্রে কাজ করা পক্ষপাতদুষ্ট, তবে বুলেটগুলির মতো খুব হালকা প্রসেসিংয়ের জন্য ব্যবহৃত কিশোরী বস্তু বরাদ্দকরণ এবং মুক্ত করা তুলনামূলকভাবে অত্যন্ত ব্যয়বহুল is এবং পৃথকভাবে একটি সাধারণ উদ্দেশ্য, পরিবর্তনশীল আকারের মেমরি বরাদ্দকারী বিরুদ্ধে কণা। আপনি যে কোনও কিছু সংরক্ষণ করতে আপনার উপরের ডেটা স্ট্রাকচারকে সাধারণকরণ করতে সক্ষম হওয়া উচিত, আমি মনে করি প্রতিটি টিনএই জিনিসের জন্য অর্থ প্রদান থেকে সরাসরি এই জাতীয় স্তরের বরাদ্দ / নির্মূলকরণ ব্যয় নির্মূল করা সার্থক বিনিময় হতে পারে। বরাদ্দ / অবলম্বন ব্যয় হ্রাস করার শীর্ষে, আপনি ফলাফলগুলি অনুসরণ করে উল্লেখের তুলনায় আরও ভাল লোকেশন পাবেন (কম ক্যাশে মিস এবং পৃষ্ঠা ত্রুটি, অর্থাৎ)।

জোশ জিসি সম্পর্কে যা উল্লেখ করেছেন, আমি জা-এর মতো সি # এর জিসি বাস্তবায়ন খুব ঘনিষ্ঠভাবে অধ্যয়ন করি নি, তবে জিসি বরাদ্দকারীরা প্রায়শই একটি প্রাথমিক বরাদ্দ থাকেএটি খুব দ্রুত কারণ এটি একটি অনুক্রমিক বরাদ্দকারী ব্যবহার করছে যা মাঝারি থেকে স্মৃতি মুক্ত করতে পারে না (প্রায় একটি স্ট্যাকের মতো, আপনি জিনিসগুলি মাঝখানে তৈরি করতে পারবেন না)। তারপরে মেমরি অনুলিপি করে এবং সম্পূর্ণরূপে বরাদ্দ করা মেমরিটিকে সম্পূর্ণ আলাদা করে আলাদা আলাদা থ্রেডে পৃথক বস্তুগুলি সরিয়ে দেওয়ার জন্য ব্যয়বহুল ব্যয়গুলির জন্য অর্থ প্রদান করে (যেমন কোনও লিঙ্কযুক্ত কাঠামোর মতো কিছুতে ডেটা অনুলিপি করার সময় পুরো স্ট্যাকটি ধ্বংস করার মতো), এটি পৃথক থ্রেডে সম্পন্ন হওয়ার কারণে এটি অবশ্যই আপনার অ্যাপ্লিকেশনটির থ্রেডগুলি এত স্টল করে না। তবে, এটি প্রাথমিক জিসি চক্রের পরে অতিরিক্ত স্তরের ইন্ডিয়ারেশন এবং এলওআর-এর সাধারণ ক্ষতির খুব উল্লেখযোগ্য লুকানো ব্যয় বহন করে। বরাদ্দকে ত্বরান্বিত করার এটি অন্য কৌশল - এটি কলিং থ্রেডে সস্তা করুন এবং তারপরে অন্যটিতে ব্যয়বহুল কাজ করুন work তার জন্য আপনার পরিবর্তে আপনার অবজেক্টের রেফারেন্সের জন্য দুটি স্তরের ইন্ডিয়ারেশন দরকার কারণ এগুলি আপনার প্রাথমিকভাবে বরাদ্দ করা সময়ের এবং প্রথম চক্রের পরে স্মৃতিতে বদলে যাবে।

অনুরূপ শিরাতে থাকা অন্য কৌশল যা সি ++ এ প্রয়োগ করা একটু সহজ। একটি ডেটা স্ট্রাকচারের শেষে কেবল যুক্ত করা এবং যুক্ত করা যুক্ত করে রাখুন যা মাঝখানে থেকে জিনিসগুলি সরাতে দেয় না। তবে সেই বিষয়গুলি চিহ্নিত করুন যা অপসারণ করা দরকার। তারপরে একটি পৃথক থ্রেড সরানো উপাদানগুলি ছাড়াই একটি নতুন ডেটা কাঠামো তৈরির ব্যয়বহুল কাজের যত্ন নিতে পারে এবং তারপরে পরমাণুর সাথে পুরানোটির সাথে নতুনটি অদলবদল করে, উদাহরণস্বরূপ, বরাদ্দকরণ এবং তদারক উভয় মূল্যের ব্যয়ের বেশিরভাগই একটিকে দেওয়া যেতে পারে পৃথক থ্রেড যদি আপনি এমন ধারনা তৈরি করতে পারেন যে কোনও উপাদান অপসারণের জন্য অনুরোধ করা অবিলম্বে সন্তুষ্ট হওয়ার দরকার নেই। এটি কেবল আপনার থ্রেডের সাথে সম্পর্কিত হিসাবে নিখরচায়কেও কম সস্তা করে না তবে বরাদ্দকে আরও সস্তা করে তোলে, যেহেতু আপনি অনেক সহজ এবং ঘন ডেটা স্ট্রাকচার ব্যবহার করতে পারেন যা মাঝখান থেকে কখনও অপসারণের মামলাগুলি পরিচালনা করতে হয় না। এটি এমন ধারকটির মতো যা কেবল একটি প্রয়োজনpush_backসন্নিবেশ জন্য ফাংশন, clearসমস্ত উপাদান মুছে ফেলার জন্য একটি ফাংশন, এবং swapমুছে ফেলা উপাদানগুলি বাদ দিয়ে একটি নতুন, কমপ্যাক্ট ধারক দিয়ে সামগ্রীগুলি অদলবদল করতে; এটাই যতদূর বদলে যায়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.