স্মার্ট পয়েন্টার থাকলে কেন আবর্জনা সংগ্রহ


67

আজকাল, এতগুলি ভাষা আবর্জনা সংগ্রহ করা হয়। এটি তৃতীয় পক্ষের দ্বারা সি ++ এর জন্য উপলব্ধ। তবে সি ++ এর রয়েছে RAII এবং স্মার্ট পয়েন্টার। তাহলে আবর্জনা সংগ্রহের কী লাভ? এটি অতিরিক্ত কিছু করছে?

এবং সি # এর মতো অন্যান্য ভাষায়, যদি সমস্ত উল্লেখগুলি স্পেসিফিকেশন এবং প্রয়োগের মাধ্যমে স্মার্ট পয়েন্টার হিসাবে বিবেচনা করা হয় (RAII কে একপাশে রেখে), তখনও কি আবর্জনা সংগ্রহকারীদের কোনও প্রয়োজন হবে? যদি না হয় তবে তা কেন এমন নয়?


1
এই প্রশ্নটি জিজ্ঞাসা করার পরে আমি একটি জিনিস বুঝতে পেরেছিলাম - স্বয়ংক্রিয় অবলম্বন পরিচালনা করতে স্মার্ট পয়েন্টারগুলির জন্য আরআইআইআই প্রয়োজন
গুলশান

8
স্মার্ট পয়েন্টারগুলির অর্থ জিসির জন্য আরআইআই ব্যবহার করা;)
দারিও

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

উত্তর:


67

তো, আবর্জনা সংগ্রহের কী লাভ?

আমি ধরে নিচ্ছি আপনার রেফারেন্স গণনা করা স্মার্ট পয়েন্টার হিসাবে বোঝাচ্ছি এবং আমি নোট করব যে এগুলি আবর্জনা সংগ্রহের একটি (প্রাথমিক) ফর্ম তাই আমি "রেফারেন্স গণনা করা স্মার্ট পয়েন্টারগুলির উপরে আবর্জনা সংগ্রহের অন্যান্য ফর্মগুলির কী কী" এই প্রশ্নের উত্তর দেব " পরিবর্তে.

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

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

  • অদৃশ্যতা । সাধারণ স্মার্ট পয়েন্টার বাস্তবায়নগুলি ডেস্ট্রাক্টরদের তুষারপাতের অনুমতি দেয়, ফলস্বরূপ আনবাউন্ডেড বিরামের সময়গুলি। আবর্জনা সংগ্রহের অন্যান্য ফর্মগুলি অনেক বেশি বর্ধনশীল এবং এমনকি আসল সময় হতে পারে, যেমন বাকেরের ট্রেডমিল।


23
বিশ্বাস করা যায় না এই উত্তরটি শীর্ষের উত্তরটি শেষ করেছে। এটি সি ++ স্মার্ট পয়েন্টারগুলির সামগ্রিক বোঝার অভাব দেখায় এবং এমন দাবি করে যে বাস্তবতার সাথে এতটা সমন্বয়হীন যে এটি কেবল হাস্যকর। প্রথমত, স্মার্ট পয়েন্টার যে সি ++ কোডের একটি সুনির্দিষ্টভাবে নকশাকৃত অংশে সবচেয়ে প্রভাবশালী হবে তা হল অনন্য পয়েন্টার, শেয়ার পয়েন্টার নয়। en.cppreferences.com/w/cpp/memory/unique_ptr এবং দ্বিতীয়ত, আমি বিশ্বাস করতে পারি না যে আপনি 'পারফরম্যান্স' সুবিধাগুলি এবং স্মার্ট পয়েন্টারগুলির তুলনায় অ- নিষ্ক্রিয় আবর্জনা সংগ্রহের রিয়েল-টাইম সুবিধার দাবি করছেন।
ব্যবহারকারী1703394

4
@ ব্যবহারকারী1703394 এটি প্রদর্শিত হয় যে উত্তরদাতাদের মনে পয়েন্টারগুলি ভাগ ছিল (সঠিকভাবে বা ভুলভাবে, আমি ওপিরা কী পরামর্শ দিচ্ছে তা আমি পুরোপুরি নিশ্চিত নই), যা নিরবচ্ছিন্ন আবর্জনা সংগ্রহের চেয়ে কম পারফরম্যান্ট।
নাথান কুপার

8
এগুলি সমস্ত স্ট্র ম্যান আর্গুমেন্ট এবং কেবলমাত্র যদি আপনি প্রকৃত প্রশ্নটিকে সম্পূর্ণ উপেক্ষা করেন বা বিভিন্ন ধরণের স্মার্ট পয়েন্টারগুলির প্রকৃত ব্যবহারের ধরণগুলি উপেক্ষা করেন তবেই তা বৈধ। প্রশ্নটি ছিল স্মার্ট পয়েন্টার সম্পর্কে। হ্যাঁ শেয়ারড_পিটার হ'ল স্মার্ট পয়েন্টার এবং হ্যাঁ শেয়ারড_পিটার স্মার্ট পয়েন্টারগুলির মধ্যে সবচেয়ে ব্যয়বহুল, তবে না, কোনও পারফরম্যান্স যুক্তি প্রাসঙ্গিকের নিকটে তৈরি করার জন্য কোথাও তাদের বিস্তৃত ব্যবহারের জন্য প্রকৃত যুক্তি নেই। গুরুতরভাবে, এই উত্তরটি রেফারেন্স গণনা সম্পর্কিত কোনও প্রশ্নে স্থানান্তরিত হওয়া উচিত। আমি একটি ভাল স্মার্ট পয়েন্টার প্রশ্নের উত্তর একটি দুর্বল রেফারেন্স।
ব্যবহারকারী1703394

4
"স্মার্ট পয়েন্টারগুলি কি বিস্তৃত ধারণা নয়", সিরিয়াসলি? আপনি এখনও জানেন না যে এই বিবৃতিটি আপনার এ পর্যন্ত করা সমস্ত সম্ভাব্য বৈধ আর্গুমেন্টকে কতটা হীন করে দেয়। মরিচা মালিকানার দিকে ঝুঁকুন এবং শব্দার্থক পদক্ষেপগুলি দেখুন : koerbitz.me/posts/… সি ++ এর সাথে historic তিহাসিক অভিজ্ঞতা সম্পন্ন লোকের পক্ষে স্মৃতিশক্তি মডেল সহ সি ++ 11 / সি ++ 14 স্মরণ করা সহজ নয় যে স্মার্ট মডেলটি উন্নত হয়েছে পয়েন্টার এবং মুভ শব্দার্থকগুলি তাদের পূর্বসূরীদের চেয়ে সম্পূর্ণ আলাদা জন্তু। জাস্ট এটি কী করে তা একবার দেখুন, এটি সি ++ এর চেয়ে পরিষ্কার এবং এটি নতুন দৃষ্টিভঙ্গি সরবরাহ করে।
ব্যবহারকারী1703394

6
@ ব্যবহারকারী1703394: "ধ্বংসকারীদের কারণে আনবাউন্ডেড বিরাম বিরতি হ'ল RAII এর দুর্ভাগ্যজনক সম্পত্তি হ'ল স্মরণহীন সংস্থানগুলির জন্য ব্যবহৃত হচ্ছে"। না, স্মৃতিবিহীন সংস্থানগুলির সাথে এর কিছুই করার নেই।
জন হারপ

63

যেহেতু কেউ এই কোণ থেকে এটি দেখেনি, আমি আপনার প্রশ্নটি পুনরায় বলব: আপনি যদি কোনও লাইব্রেরিতে এটি করতে পারেন তবে ভাষায় কিছু কেন রাখবেন? সুনির্দিষ্ট বাস্তবায়ন এবং সিনট্যাকটিক বিশদ উপেক্ষা করে জিসি / স্মার্ট পয়েন্টারগুলি মূলত সেই প্রশ্নের একটি বিশেষ বিষয়। আপনি যদি কোনও লাইব্রেরিতে এটি প্রয়োগ করতে পারেন তবে কেন কোনও জঞ্জাল সংগ্রহকারীকে ভাষাতেই সংজ্ঞায়িত করবেন?

এই প্রশ্নের উত্তর দুটি আছে। সবচেয়ে গুরুত্বপূর্ণ প্রথম:

  1. আপনি নিশ্চিত করেছেন যে সমস্ত কোড এটিকে আন্তঃব্যবহার করতে ব্যবহার করতে পারে। এই হল, আমি মনে করি, বড় কারণে কোড পুনঃব্যবহারের এবং কোড শেয়ারিং সত্যিই জাভা / সি # / পাইথন / রুবি পর্যন্ত খুলে নি। গ্রন্থাগারগুলিতে যোগাযোগ করা দরকার, এবং তাদের কাছে কেবলমাত্র নির্ভরযোগ্য ভাগ করা ভাষা হ'ল ভাষাটি যা অনুমান করে তা (এবং একটি ডিগ্রি পর্যন্ত, এটির স্ট্যান্ডার্ড লাইব্রেরি)। আপনি যদি কখনও সি ++ তে লাইব্রেরি পুনরায় ব্যবহার করার চেষ্টা করেন তবে আপনি সম্ভবত এমন ভয়াবহ ব্যথা অনুভব করেছেন যা কোনও স্ট্যান্ডার্ড মেমোরি শব্দার্থ কারণ নয়। আমি কিছু স্টাফ একটি স্ট্রাক্ট পাস করতে চান। আমি একটি রেফারেন্স পাস? পয়েন্টার? ?scoped_ptrsmart_ptr? আমি কি মালিকানা পার করছি, না? ইঙ্গিত করার কোনও উপায় আছে কি? যদি লিব বরাদ্দ করা দরকার? আমাকে কি এটি বরাদ্দ দিতে হবে? ভাষার মেমরি পরিচালনার অংশ না করে, সি ++ পাঠাগারগুলির প্রতিটি জুটিকে এখানে তাদের নিজস্ব কৌশলটি নিয়ে আলোচনা করতে বাধ্য করে এবং তাদের সকলের সাথে একমত হওয়া সত্যিই কঠিন। জিসি এটি একটি সম্পূর্ণ অ-ইস্যু করে।

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

  3. আপনি বিনিয়োগের উপর একটি উচ্চ রিটার্ন পাবেন। কোডের কোনও প্রদত্ত টুকরোগুলি মানটি ব্যবহার করে এটি ব্যবহারকারীর সংখ্যা দ্বারা বহুগুণ। এর অর্থ হ'ল আপনার যত বেশি ব্যবহারকারী রয়েছেন তত বেশি আপনি কোনও সফ্টওয়্যার খণ্ডে ব্যয় করতে পারবেন। আপনি যখন ভাষাতে কোনও বৈশিষ্ট্য স্থানান্তর করবেন, ভাষার সমস্ত ব্যবহারকারী এটি ব্যবহার করবেন। এর অর্থ আপনি কেবলমাত্র সেই ব্যবহারকারীর একটি উপসেট দ্বারা ব্যবহৃত লাইব্রেরিতে আপনার চেয়ে বেশি প্রচেষ্টা বরাদ্দ করতে পারেন। এ কারণেই জাভা এবং সি # এর মতো ভাষাগুলির একেবারে প্রথম-হারের ভিএম এবং চমত্কারভাবে উচ্চমানের আবর্জনা সংগ্রহকারী রয়েছে: তাদের বিকাশের ব্যয়টি কয়েক মিলিয়ন ব্যবহারকারীর মধ্যে স্বল্প পরিমাণে ব্যয় করা হয়েছে।


চমত্কার উত্তর! যদি কেবল আমি একাধিকবার উপকৃত হতে পারতাম ...
ডিন হার্ডিং

10
এটি লক্ষণীয় যে আবর্জনা সংগ্রহ আসলে সি # ভাষায়ই বাস্তবায়িত হয় না, তবে নেট নেট ফ্রেমওয়ার্কে , বিশেষত প্রচলিত ভাষা রানটাইম (সিএলআর)।
রবার্ট হার্ভে

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

ভাষা ও প্রয়োজনীয় কাঠামোটিকে জিসি সমর্থন করার একটি বড় সুবিধা হ'ল এটি নিশ্চিত করে যে স্মৃতিতে কোনও উল্লেখের অস্তিত্ব থাকবে না যা অন্য কোনও উদ্দেশ্যে বরাদ্দ হতে পারে। Disposeবিটম্যাপকে encapsulate করে এমন কোনও বস্তুর মধ্যে যদি কেউ কল করে তবে object অবজেক্টের কোনও রেফারেন্স নিষ্পত্তি করা বিটম্যাপ অবজেক্টের রেফারেন্স হবে। যদি অন্য কোডটি এটি ব্যবহারের প্রত্যাশার সময় অবধি আগেই মুছে ফেলা হয়, বিটম্যাপ শ্রেণিটি নিশ্চিত করতে পারে যে অন্য কোডটি অনুমানযোগ্য ফ্যাশনে ব্যর্থ হবে । বিপরীতে, মুক্ত মেমরির একটি রেফারেন্স ব্যবহার করা হচ্ছে অপরিজ্ঞাত আচরণ।
সুপারক্যাট

34

ময়লা আবর্জনা সংগ্রহের মূল অর্থ হ'ল আপনার বরাদ্দ হওয়া বস্তুগুলি আর পৌঁছনো না হওয়ার পরে কিছু সময় স্বয়ংক্রিয়ভাবে মুক্তি পাবে।

আরও সঠিকভাবে, যখন তারা প্রোগ্রামটির জন্য অ্যাক্সেসযোগ্য হয় তখন এগুলি ছেড়ে দেওয়া হয় , কারণ বিজ্ঞপ্তিযুক্ত রেফারেন্সযুক্ত বস্তুগুলি অন্যথায় কখনও মুক্তি পায় না।

স্মার্ট পয়েন্টারগুলি কেবল এমন কোনও কাঠামোর উল্লেখ করে যা সাধারণ পয়েন্টারের মতো আচরণ করে তবে এতে কিছু অতিরিক্ত কার্যকারিতা যুক্ত থাকে। এর মধ্যে অন্তর্ভুক্ত রয়েছে তবে অবনমন সীমাবদ্ধ নয়, পাশাপাশি অনুলিপি-অনুলিপি, আবদ্ধ চেক, ...

এখন, যেমন আপনি বলেছেন, স্মার্ট পয়েন্টারগুলি আবর্জনা সংগ্রহের একধরণের প্রয়োগ করতে ব্যবহার করা যেতে পারে

তবে চিন্তার ট্রেনটি নিম্নলিখিত পথে চলেছে:

  1. আবর্জনা সংগ্রহ করা একটি দুর্দান্ত জিনিস, কারণ এটি সুবিধাজনক এবং আমাকে কম জিনিসগুলির যত্ন নিতে হবে
  2. সুতরাং: আমি আমার ভাষায় আবর্জনা সংগ্রহ করতে চাই
  3. এখন, কীভাবে আমার ভাষায় জিসি পাবেন?

অবশ্যই, আপনি এটি শুরু থেকে এটি ডিজাইন করতে পারেন। সি # টি আবর্জনা সংগ্রহ করার জন্য তৈরি করা হয়েছিল, সুতরাং কেবলমাত্র newআপনার অবজেক্ট এবং রেফারেন্সগুলি সুযোগের বাইরে চলে গেলে এটি প্রকাশিত হবে। এটি কীভাবে করা হয় তা সংকলক পর্যন্ত।

তবে সি ++ তে কোনও জঞ্জাল সংগ্রহের উদ্দেশ্য ছিল না। যদি আমরা কিছু পয়েন্টার বরাদ্দ করি int* p = new int;এবং এটি সুযোগের বাইরে চলে pযায় তবে নিজেই স্ট্যাক থেকে সরানো হয়, তবে কেউ বরাদ্দ মেমরির যত্ন নেয় না।

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

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

তবে আপনি যদি শুরু থেকে জিসির সাথে কোনও ভাষা ডিজাইন করেন তবে এটি কেবল একটি বাস্তবায়ন বিশদ। আপনি কেবল বলেছেন যে অবজেক্টটি পরিষ্কার হয়ে যাবে এবং সংকলকটি এটি আপনার জন্য করবে।

সি ++ এর মতো স্মার্ট পয়েন্টার সম্ভবত সি # এর মতো ভাষাগুলিতেও সম্ভব হবে না, যার বিন্দুমাত্র বিনষ্ট নেই (সি # .Dispose()নির্দিষ্ট বস্তুগুলিকে কল করার জন্য সিনট্যাকটিক চিনি সরবরাহ করে এটি ঘিরে কাজ করে)। অবাস্তবিক উত্সগুলি শেষ পর্যন্ত জিসি দ্বারা পুনরুদ্ধার করা হবে, তবে ঠিক কখন এটি ঘটবে তা অপরিবর্তিত।

এবং এর ফলে, জিসি আরও কার্যকরভাবে এর কাজ করতে দেয়। যা এটি উপরে নির্ধারণ করা হয় স্মার্ট পয়েন্টার চেয়ে ভাষা, .NET জিসি যেমন মেমরি অপারেশন বিলম্ব এবং তাদের সস্তা করতে বা এমনকি ব্লক তাদের সম্পাদন করতে পারবেন গভীরে নির্মিত হচ্ছে সরাতে কত ঘন ঘন বস্তুর উপর ভিত্তি করে বৃদ্ধি দক্ষতা জন্য প্রায় মেমরির অ্যাক্সেস করা হয়।


সি # এর মাধ্যমে IDisposableএবং এর মাধ্যমে একধরণের নিয়ন্ত্রক ধ্বংস রয়েছে using। তবে এটির জন্য কিছুটা প্রোগ্রামার প্রচেষ্টা দরকার হয়, এজন্য এটি সাধারণত খুব দুর্লভ সংস্থান যেমন ডেটাবেস সংযোগ হ্যান্ডলগুলির জন্য ব্যবহৃত হয়।
জেএসবি ձոգչ

7
@ জেএসবাংস: একদম ঠিক। সি ++ জিসি পেতে যেমন আরআইআই-এর চারপাশে স্মার্ট পয়েন্টার তৈরি করে, সি # অন্যভাবে যায় এবং আরআইআই পাওয়ার জন্য জিসির চারপাশে "স্মার্ট ডিসপোজার" তৈরি করে;) বাস্তবে, এটি লজ্জার বিষয় যে এটি সিআই # তে খুব কঠিন কারণ এটি ব্যতিক্রমের জন্য দুর্দান্ত- নিরাপদ সংস্থান হ্যান্ডলিং। উদাহরণস্বরূপ F # IDisposableকেবলমাত্র প্রচলিত let ident = valueদ্বারা প্রতিস্থাপন করে একটি সহজ বাক্য গঠন চেষ্টা করে use ident = value...
ডারিও

@ডারিও: "সি # অন্যভাবে চলে যায় এবং আরআইআই পাওয়ার জন্য জিসির চারপাশে 'স্মার্ট ডিসপোজার' তৈরি করে"। সি # তে থাকা আরআইআইয়ের usingসাথে আবর্জনা সংগ্রহের কোনও যোগসূত্র নেই, যখন ভেরিয়েবল কেবল সি ++ তে ধ্বংসকারীদের মতো সুযোগের বাইরে চলে যায় তখন এটি কেবল একটি ফাংশন বলে।
জন হ্যারোপ

1
@ জন হ্যারোপ: প্লিজ কী? আপনার যে বক্তব্যটি উদ্ধৃত করা হয়েছে তা কোনও সাধারণ রেফারেন্স গণনা / স্মার্ট পয়েন্টার / আবর্জনা সংগ্রহ জড়িত ছাড়াই প্লেইন সি ++ ডিস্ট্রাক্টর সম্পর্কে।
দারিও

1
"আবর্জনা সংগ্রহের মূল অর্থ হ'ল আপনার বরাদ্দকৃত বস্তুগুলি যখন আর রেফারেন্স করা হচ্ছে না তখন স্বয়ংক্রিয়ভাবে ছেড়ে দেওয়া হয় More আরও সঠিকভাবে, যখন তারা প্রোগ্রামটির জন্য অ্যাক্সেসযোগ্য হয় না তখন তাদের মুক্তি দেওয়া হয়, কারণ বিজ্ঞপ্তিযুক্ত রেফারেন্সযুক্ত বস্তুগুলি অন্যথায় কখনও মুক্তি পায় না।" ... আরও নির্ভুলভাবে বলতে হবে যে এগুলি স্বয়ংক্রিয়ভাবে কিছু সময় পরে মুক্তি পেয়েছে , কখন নয় । মনে রাখবেন যে যখন পুনরুদ্ধারটি অবিলম্বে ঘটে যায় তখন প্রকৃতপক্ষে পুনরুদ্ধারটি প্রায়শই পরে ঘটে।
টড লেহম্যান

4

আমার মনের মধ্যে দুটি বড় পার্থক্য রয়েছে মেমরি পরিচালনার জন্য ব্যবহৃত আবর্জনা সংগ্রহ এবং স্মার্ট পয়েন্টারগুলির মধ্যে:

  1. স্মার্ট পয়েন্টারগুলি চক্রীয় আবর্জনা সংগ্রহ করতে পারে না; আবর্জনা সংগ্রহ করতে পারেন
  2. স্মার্ট পয়েন্টারগুলি অ্যাপ্লিকেশন থ্রেডে রেফারেন্সিং, ডেরফেরেন্সিং এবং ডিএলোকেশন মুহুর্তে সমস্ত কাজ করে; আবর্জনা সংগ্রহের দরকার নেই

প্রাক্তনটির অর্থ হ'ল জিসি আবর্জনা সংগ্রহ করবেন যা স্মার্ট পয়েন্টারগুলি করবে না; আপনি যদি স্মার্ট পয়েন্টার ব্যবহার করেন তবে আপনাকে এই ধরণের আবর্জনা তৈরি এড়াতে হবে, বা ম্যানুয়ালি এটি মোকাবেলা করার জন্য প্রস্তুত থাকতে হবে।

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

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

তবে, মেমরি পরিচালনার উদ্দেশ্যে, আমি আবর্জনা সংগ্রহের পরিবর্তে স্মার্ট পয়েন্টারগুলির কোনও সম্ভাবনা দেখতে পাচ্ছি না। তারা কেবল এটিতে ভাল হয় না।


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

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

3
জটিলতার জন্য: হ্যাঁ, জিসিগুলি জটিল, তবে আমি জানি না যে "বেশিরভাগ প্রকৃতপক্ষে মেমরি ফাঁস হয় এবং এটি বেশ দক্ষ হয় না", এবং অন্যথায় কিছু প্রমাণ দেখতে আগ্রহী হবে। বোহেম প্রমাণ নয়, কারণ এটি একটি খুব আদিম বাস্তবায়ন এবং এটি এমন একটি ভাষা সি, যেখানে সঠিক জিসি প্রকারের সুরক্ষার অভাবে মৌলিকভাবে অসম্ভব, পরিবেশন করার জন্য নির্মিত। এটি একটি সাহসী প্রচেষ্টা, এবং এটি আদৌ কাজ করে তা খুব চিত্তাকর্ষক, তবে আপনি এটিকে জিসির উদাহরণ হিসাবে নিতে পারবেন না।
টম অ্যান্ডারসন

8
@ জন: নিঃসন্দেহে বুলশিট নয়bugzilla.novell.com/show_bug.cgi?id=621899 বা আরও সাধারণভাবে: ফ্লাইংফ্রোগব্লগ.ব্লগস্পট.com / 2009 / 01/… এটি সুপরিচিত এবং সমস্ত রক্ষণশীল জিসিগুলির একটি সম্পত্তি।
কনরাড রুডল্ফ

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

3

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

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

অন্যদের হিসাবে যেমন বলা হয়েছে, রেফারেন্স গণনা করা স্মার্ট পয়েন্টারগুলি আবর্জনা সংগ্রহের একটি ফর্ম এবং এর জন্য একটি বড় সমস্যা রয়েছে। আবর্জনা সংগ্রহের রেফারেন্স গণনা করা ফর্মগুলির অপূর্ণতার হিসাবে যে উদাহরণটি বেশিরভাগ ক্ষেত্রে ব্যবহৃত হয় তা হ'ল একে অপরের সাথে স্মার্ট পয়েন্টারগুলির সাথে সংযুক্ত অনাথ ডাটা স্ট্রাকচার তৈরির সমস্যা যা একে অপরকে সংগ্রহ করা থেকে বিরত রাখে object গণনার অভিনেতা-মডেল অনুসারে ডিজাইন করা একটি প্রোগ্রামে, যখন আপনি মাল্টি থ্রেড প্রোগ্রামিংয়ের জন্য বিস্তৃত শেয়ারড ডেটা পদ্ধতির ব্যবহার করেন, তখন বৃহত অংশে ব্যবহৃত হয়, তখন ডেটা স্ট্রাকচারগুলি সাধারণত সি ++ তে এই ধরণের নন-কালেক্টেবল ক্লাস্টারগুলি তৈরি হতে দেয় না as শিল্পের, এই অনাথ ক্লাস্টারগুলি দ্রুত বাস্তবে পরিণত হতে পারে।

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


1
এর অর্থ কি Rustআবর্জনা সংগ্রহের দরকার নেই?
গুলশান

1
@ গুলশান মরিচা খুব অল্প কয়েকটি ভাষার মধ্যে একটি যা নিরাপদ অনন্য পয়েন্টারগুলিকে সমর্থন করে।
কোডসইনচওস

2

বেশিরভাগ স্মার্ট পয়েন্টার রেফারেন্স গণনা ব্যবহার করে প্রয়োগ করা হয়। এটি হ'ল প্রতিটি স্মার্ট পয়েন্টার যা কোনও অবজেক্টকে রেফার করে তা বস্তুর রেফারেন্স গণনাটিকে বাড়িয়ে তোলে। যখন সেই গণনা শূন্যে যায়, তখন অবজেক্টটি প্রকাশ হয়।

আপনার যদি বিজ্ঞপ্তি রেফারেন্স থাকে তবে সমস্যাটি রয়েছে। এটি হ'ল, এ এর ​​বি এর সাথে রেফারেন্স রয়েছে, বি সি এর সাথে রেফারেন্স রয়েছে এবং সি এর সাথে এ সম্পর্কিত রেফারেন্স রয়েছে যদি আপনি স্মার্ট পয়েন্টার ব্যবহার করেন তবে এ, বি এবং সি এর সাথে যুক্ত স্মৃতিটিকে মুক্ত করার জন্য আপনাকে ম্যানুয়ালি প্রয়োজন সেখানে একটি বিজ্ঞপ্তি রেফারেন্স "বিরতি" পান (যেমন weak_ptrসি ++ ব্যবহার করে )।

আবর্জনা সংগ্রহ (সাধারণত) বেশ আলাদাভাবে কাজ করে। আজকাল বেশিরভাগ আবর্জনা সংগ্রহকারীরা একটি পুনঃচঞ্চলতা পরীক্ষা ব্যবহার করেন । এটি হ'ল এটি স্ট্যাকের সমস্ত রেফারেন্স এবং বিশ্বব্যাপী অ্যাক্সেসযোগ্য সমস্তগুলির দিকে নজর রাখে এবং তারপরে সেই সমস্ত উল্লেখগুলি যে রেফারেন্সগুলিতে উল্লেখ করা হয় এবং যে বিষয়গুলি তারা উল্লেখ করে সেগুলি সনাক্ত করে etc.

এইভাবে, বিজ্ঞপ্তি সংক্রান্ত রেফারেন্সগুলির পক্ষে আর কিছু আসে যায় না - যতক্ষণ না এ, বি এবং সি উভয়ই পৌঁছাতে পারে না, ততক্ষণ স্মৃতি পুনরুদ্ধার করা যায়।

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

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

যাই হোক না কেন, সমস্যাটি কাট-শুকনো নয় অন্যটির চেয়ে ভাল। এগুলির প্রত্যেকেরই সুবিধা এবং অসুবিধা রয়েছে।


2

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

বড় আকারের অবজেক্ট বরাদ্দ করতে C ++ (ডাব্লু / ও কোনও জিসি) চেষ্টা করুন, "হ্যালো" মুদ্রণ করুন, তারপরে সেগুলি মুছুন। অবজেক্টগুলি মুক্ত করতে কতক্ষণ সময় লাগে আপনি অবাক হয়ে যাবেন।

এছাড়াও, GNU libc মেমোরি আনলোকেট করার জন্য আরও কার্যকর সরঞ্জাম সরবরাহ করে, বাধাগুলি দেখুন । অবশ্যই লক্ষ্য করুন, বাধা নিয়ে আমার কোনও অভিজ্ঞতা নেই, আমি সেগুলি কখনও ব্যবহার করি না।


নীতিগতভাবে আপনার একটি বক্তব্য রয়েছে তবে এটি অবশ্যই লক্ষ করা উচিত যে এটি এমন একটি সমস্যা যা খুব সহজ সমাধান: ডিলোকেশনগুলি বান্ডিল করতে একটি পুল বরাদ্দকারী বা ছোট অবজেক্ট বরাদ্দ ব্যবহার করুন। তবে এটি স্বীকার করেছেন যে ব্যাকগ্রাউন্ডে একটি জিসি রান চালানোর চেয়ে আরও বেশি প্রচেষ্টা নেওয়া দরকার।
কনরাড রুডল্ফ

হ্যাঁ, অবশ্যই, জিসি অনেক বেশি আরামদায়ক। (বিশেষত নতুনদের জন্য: মালিকানার সমস্যা নেই, এমনকি মুছে ফেলার অপারেটর নেই))
ern0

3
@ এর্ন0: না (রেফারেন্স গণনা) স্মার্ট পয়েন্টারগুলির পুরো পয়েন্টটি হ'ল মালিকানার সমস্যা নেই এবং মুছুন অপারেটর নেই।
কনরাড রুডল্ফ

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

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

2

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

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

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

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

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


1
"আপনার কোনও সময়ে ডি-বরাদ্দকরণের ক্রিয়াকলাপের একটি বড় ফোর হবে"। বেকারের ট্রেডমিল একটি সুন্দর বর্ধিত আবর্জনা সংগ্রাহকের একটি উদাহরণ। memorymanagement.org/glossary/t.html#treadmill
জন

1

স্মার্ট পয়েন্টারগুলির এক নম্বর সীমাবদ্ধতা হ'ল তারা সর্বদা বিজ্ঞপ্তি রেফারেন্সের বিরুদ্ধে সহায়তা করে না। উদাহরণস্বরূপ আপনার অবজেক্ট এ একটি অবজেক্ট বি এবং অবজেক্ট বিতে একটি স্মার্ট পয়েন্টার সংরক্ষণ করছে এটিকে অবজেক্ট করতে একটি স্মার্ট পয়েন্টার সংরক্ষণ করছে যদি পয়েন্টারগুলির কোনওটি পুনরায় সেট না করে সেগুলি একসাথে ছেড়ে দেওয়া হয় তবে সেগুলি কখনও বিচ্যুত হবে না।

এটি হ'ল কারণ একটি স্মার্ট পয়েন্টারকে একটি নির্দিষ্ট ক্রিয়া করতে হবে যা উপরের দৃশ্যে ট্রিগার করা হবে না কারণ উভয় বস্তু প্রোগ্রামটিতে অ্যাক্সেসযোগ্য। আবর্জনা সংগ্রহ মোকাবেলা করবে - এটি সঠিকভাবে সনাক্ত করবে যে প্রোগ্রামগুলিতে অবজেক্টগুলি পৌঁছনীয় নয় এবং সেগুলি সংগ্রহ করা হবে।


1

এটি একটি বর্ণালী

আপনি যদি পারফরম্যান্সের উপর দৃ tight় সীমানা রাখতে চান না এবং গ্রাইন্ডটি প্রস্তুত করতে প্রস্তুত হন তবে আপনি সঠিক সিদ্ধান্ত গ্রহণের জন্য এবং সমস্ত স্বাধীনতা আপনার উপর দিয়ে সমস্ত সমাবেশের মাধ্যমে সমাবেশ বা সিতে পৌঁছে যাবেন, তবে এটি দিয়ে , এটি বিভ্রান্ত করার সমস্ত স্বাধীনতা:

"আমি আপনাকে বলব কী করতে হবে, আপনি এটি করেন me বিশ্বাস রাখুন"।

জঞ্জাল সংগ্রহ বর্ণালীটির অন্য প্রান্ত। আপনার খুব সামান্য নিয়ন্ত্রণ রয়েছে তবে এটি আপনার জন্য যত্ন নেওয়া:

"আমি যা চাই তা আমি আপনাকে বলব, আপনি এটি ঘটিয়ে দিন"।

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

আরএআইআই, স্কোপিং, রেফ কাউন্টিং ইত্যাদি হ'ল আপনাকে সেই বর্ণালীটি বরাবর আরও এগিয়ে যেতে দেওয়ার জন্য সমস্ত সহায়ক কিন্তু এটি সেখানে পুরোপুরি নয়। এই সমস্ত কিছুর জন্য এখনও সক্রিয় ব্যবহার প্রয়োজন। তারা এখনও আপনাকে মেমরির পরিচালনার সাথে এমনভাবে যোগাযোগ করতে দেয় যাতে আবর্জনা সংগ্রহ না হয়।


0

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

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

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