কেন রেফারেন্স গণনা স্মার্ট পয়েন্টার এত জনপ্রিয়?


52

আমি দেখতে পাচ্ছি, অনেকগুলি রিয়েল-ওয়ার্ল্ড সি ++ প্রকল্পে স্মার্ট পয়েন্টারগুলি ব্যাপকভাবে ব্যবহৃত হয়।

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

বোহেম জিসির মতো যথাযথ আবর্জনা সংগ্রহকারীকে সংহত করার চেয়ে ভাগ কেন পয়েন্টার বেশি জনপ্রিয় ? (বা আপনি কি একেবারেই একমত হন যে এগুলি প্রকৃত জিসির চেয়ে বেশি জনপ্রিয়?)

রেফারেন্স-কাউন্টিংয়ের তুলনায় আমি প্রচলিত জিসির দুটি সুবিধা সম্পর্কে জানি:

  • প্রচলিত জিসি অ্যালগরিদমগুলির রেফারেন্স-চক্র নিয়ে কোনও সমস্যা নেই ।
  • রেফারেন্স-গণনা সাধারণত একটি উপযুক্ত জিসির চেয়ে ধীর হয়

রেফারেন্স-কাউন্টিং স্মার্ট পয়েন্টার ব্যবহার করার কারণগুলি কী কী?


6
আমি কেবল একটি মন্তব্য যুক্ত করব যে এটি ব্যবহারের জন্য এটি একটি ভুল ডিফল্ট: বেশিরভাগ ক্ষেত্রেই std::unique_ptrযথেষ্ট এবং রান-টাইম পারফরম্যান্সের ক্ষেত্রে কাঁচা পয়েন্টারগুলির তুলনায় শূন্য-ওভারহেড রয়েছে। std::shared_ptrসর্বত্র ব্যবহার করে আপনি মালিকানা শব্দার্থবিজ্ঞানকেও অস্পষ্ট করে রেখেছিলেন, স্বয়ংক্রিয় সংস্থান ব্যবস্থা ব্যতীত স্মার্ট পয়েন্টারগুলির একটি বড় সুবিধা - কোডের পিছনে উদ্দেশ্যটির স্পষ্ট বোঝা।
ম্যাট

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

উত্তর:


57

আবর্জনা সংগ্রহের তুলনায় রেফারেন্স গণনার কিছু সুবিধা:

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

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

  3. সহজ। রেফারেন্স গণনা কয়েক মিনিটের মধ্যে ব্যাখ্যা করা যেতে পারে, এবং এক বা দুই ঘন্টার মধ্যে প্রয়োগ করা যেতে পারে। আবর্জনা সংগ্রহকারী, বিশেষত শালীন কার্য সম্পাদনকারীরা অত্যন্ত জটিল এবং অনেক লোক এগুলি বোঝে না।

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

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

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


16
সুনির্দিষ্ট রেফারেন্স-গণনা বাস্তবায়ন বিলম্বিত ব্যয় করে সাধারণত উত্পাদন জিসি (30-40%) এর তুলনায় অনেক কম থ্রুপুট পান। রিফকাউন্টের জন্য কম বিট ব্যবহার করা এবং ট্র্যাকিং অবজেক্টগুলি এড়িয়ে যাওয়া এড়িয়ে যাওয়া যেমন অপ্টিমাইজেশন দিয়ে ফাঁকটি বন্ধ করা যেতে পারে mainly সি ++ এটি স্বাভাবিকভাবেই শেষ করে যদি আপনি মূলত make_sharedফিরে আসেন। তবুও, রিয়েলটাইম অ্যাপ্লিকেশনগুলিতে বিলম্বিতা সবচেয়ে বড় সমস্যা হিসাবে দেখা দেয় তবে সাধারণত থ্রুপুট আরও গুরুত্বপূর্ণ, যার কারণেই ট্রেসিং জিসিগুলি এত ব্যাপকভাবে ব্যবহৃত হয়। আমি তাদের সম্পর্কে খারাপ কথা বলতে এত তাড়াতাড়ি করব না।
জন পুরি

3
সহজ পদ: আমি 'সহজ' টাল চাই প্রয়োজনীয় বাস্তবায়ন মোট পরিমাণ হ্যাঁ, কিন্তু সহজ কোড যে জন্য ব্যবহার এটা: কেউ রেসিন কীভাবে ব্যবহার করবেন তা (কহন তুলনা 'do এই যখন বস্তু তৈরি এবং এই তাদের যখন অন্তক' ) কীভাবে (নির্লজ্জভাবে, যা প্রায়শই যথেষ্ট) জিসি ('...') ব্যবহার করবেন।
আকাশম

4
"রেফারেন্স গণনা সহ, আপনি গ্যারান্টিযুক্ত যে আপনার অবজেক্ট তাত্ক্ষণিকভাবে এটির শেষ রেফারেন্সটি চলে গেলে মুক্তি দেওয়া হবে"। এটি একটি সাধারণ ভুল ধারণা। ফ্লাইংফ্রোগব্লগ.ব্লগস্পট.কম.৩০/১০
জন

4
@ জোনহরপ: এই ব্লগ-পোস্টটি ভয়াবহভাবে ভুল-মাথা। আপনার সমস্ত মন্তব্য পড়তে হবে , বিশেষত শেষটি।
উত্সাহক

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

26

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

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

একটি ভাল, সুসংযুক্ত জিসি একটি দুর্দান্ত জিনিস হতে পারে। তবে সি ++ এর মতো ভাষায়, লাভগুলি সর্বনিম্ন এবং ব্যয়গুলি প্রায়শই এটির পক্ষে মূল্যহীন।

তবে এটি দেখতে আকর্ষণীয় হবে যেহেতু সি ++ 11 আরও জনপ্রিয় হয়ে উঠেছে, ল্যাম্বডাস এবং ক্যাপচার শব্দার্থবিজ্ঞানগুলি সি ++ সম্প্রদায়কে একই ধরণের বরাদ্দের দিকে নিয়ে যেতে শুরু করে এবং আজীবন সমস্যাগুলির কারণে যা লিস্প সম্প্রদায়কে প্রথমে জিসি আবিষ্কার করেছিল? জায়গা।

আরও দেখুন Stackoverflow উপর একটি সম্পর্কিত প্রশ্ন তার বেশি বয়সের জন্য আমার উত্তর


6
বো বোহাম জিসি, আমি মাঝে মধ্যেই ভাবতাম যে কেবলমাত্র সাধারণভাবে প্রযুক্তির একটি খারাপ ধারণা প্রদানের মাধ্যমে সি এবং সি ++ প্রোগ্রামারদের মধ্যে জিসির প্রতি প্রচলিত বিদ্বেষের জন্য ব্যক্তিগতভাবে এটি কতটা দায়বদ্ধ।
লুশেনকো

@ লুশেনকো ভাল বলেছেন। এক্ষেত্রে এই প্রশ্নটি হ'ল যেখানে বোহেম জিসিকে বলা হয় "যথাযথ" গিসি, এটিকে উপেক্ষা করে এটি ধীর এবং বাস্তবিকভাবে ফাঁস হওয়ার গ্যারান্টিযুক্ত। কেউ ভাগ করে নেওয়া_পিটারের জন্য পাইথন-স্টাইলের চক্র ব্রেকার প্রয়োগ করেছে কিনা তা অনুসন্ধান করার সময় আমি এই প্রশ্নটি পেয়েছি, যা সি ++ বাস্তবায়নের জন্য উপযুক্ত লক্ষ্য বলে মনে হচ্ছে।
ব্যবহারকারী 4815162342

4

আমি দেখতে পাচ্ছি, অনেকগুলি রিয়েল-ওয়ার্ল্ড সি ++ প্রকল্পে স্মার্ট পয়েন্টারগুলি ব্যাপকভাবে ব্যবহৃত হয়।

সত্য তবে, বস্তুনিষ্ঠভাবে, কোডের বিস্তৃত সংখ্যা এখন আবর্জনা সংগ্রহকারীদের ট্রেস করে আধুনিক ভাষায় রচিত।

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

এটি একটি খারাপ ধারণা কারণ আপনার এখনও চক্র সম্পর্কে চিন্তা করা দরকার।

বোহেম জিসির মতো যথাযথ আবর্জনা সংগ্রহকারীকে সংহত করার চেয়ে ভাগ কেন পয়েন্টার বেশি জনপ্রিয়? (বা আপনি কি একেবারেই একমত হন যে এগুলি প্রকৃত জিসির চেয়ে বেশি জনপ্রিয়?)

ওহ বাহ, আপনার চিন্তাভাবনার লাইনে অনেক কিছুই ভুল আছে:

  1. বোহেমের জিসি শব্দের কোনও অর্থে কোনও "যথাযথ" জিসি নয়। এটা সত্যিই ভয়াবহ। এটি রক্ষণশীল তাই এটি ফাঁস হয় এবং ডিজাইনে অদক্ষ। দেখুন: http://flyingfrogblog.blogspot.co.uk/search/label/boehm

  2. ভাগ করা পয়েন্টারগুলি বস্তুনিষ্ঠভাবে, জিসি হিসাবে খুব বেশি জনপ্রিয় এখন আর নেই কারণ বিশাল সংখ্যক বিকাশকারী এখন জিসি'ড ভাষা ব্যবহার করছে এবং তাদের ভাগ করে নেওয়া পয়েন্টারগুলির প্রয়োজন নেই। C ++ এর তুলনায় চাকরির বাজারে কেবল জাভা এবং জাভাস্ক্রিপ্ট দেখুন।

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

রেফারেন্স-কাউন্টিং স্মার্ট পয়েন্টার ব্যবহার করার কারণগুলি কী কী?

আপনি সি ++ তে সীমাবদ্ধ তবে ইচ্ছুক আপনি স্বয়ংক্রিয়ভাবে মেমরি পরিচালনা করতে পারেন।


7
ওম, এটি সি ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + + + + + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ভভ সম্পর্কে স +++++++++++++++++++++++++++++> +++++++++++++++++++++++++ + স্পষ্টতই, কোনও সাধারণ বিবৃতি সি ++ কোডের মধ্যে কথা বলছে , প্রোগ্রামিংয়ের পুরোপুরি নয়। সুতরাং তবে "অবজেক্টিভালি" আবর্জনা সংগ্রহের বিষয়টি সি ++ বিশ্বের বাইরে ব্যবহৃত হতে পারে, যা হাতে থাকা প্রশ্নের সাথে শেষ পর্যন্ত অপ্রাসঙ্গিক।
নিকল বোলাস

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

3
@ জোনহরপ: সুতরাং, জিসির সাথে এবং ছাড়া সমতুল্য ছোট ছোট প্রোগ্রামগুলি তুলনা করুন, যা উভয় পক্ষের সুবিধার্থে স্পষ্টভাবে বেছে নেওয়া হয় না are আপনি কোনটি আরও মেমরির প্রত্যাশা করবেন?
প্রতিলিপি

1
@ উত্সাহক: আমি এমন প্রোগ্রামগুলির কল্পনা করতে পারি যা ফলাফল দেয়। রেফারেন্স গণনাটি ট্রেসিং জিসিকে ছাড়িয়ে যাবে যখন প্রোগ্রামটি নার্সারি (যেমন তালিকার একটি সারি) বেঁচে না আসা পর্যন্ত হিপ বরাদ্দ মেমরি রাখার জন্য তৈরি করা হয়েছে কারণ এটি একটি জেনারাল জিসির জন্য প্যাথলজিকাল পারফরম্যান্স এবং সবচেয়ে ভাসমান আবর্জনা তৈরি করবে। জঞ্জাল সংগ্রহের সন্ধানের ক্ষেত্রে স্কোপ-ভিত্তিক রেফারেন্স গণনার চেয়ে কম মেমরির প্রয়োজন হবে যখন অনেকগুলি ছোট ছোট বস্তু থাকে এবং জীবনকাল সংক্ষিপ্ত হলেও পরিসংখ্যানগতভাবে সুপরিচিত নয় তাই খাঁটি কার্যকরী ডেটা স্ট্রাকচার ব্যবহার করে যুক্তি প্রোগ্রামের মতো কিছু।
জন হ্যারোপ

3
@ জনহরপ: আমি জিসি (ট্রেসিং বা যাই হোক না কেন) এবং আরআইআইআই বলতে চাইছি যদি আপনি সি ++ বলেন speak যার মধ্যে উল্লেখ-গণনা অন্তর্ভুক্ত রয়েছে তবে কেবল এটি কার্যকর। অথবা আপনি একটি সুইফ্ট প্রোগ্রামের সাথে তুলনা করতে পারেন।
উত্সাহক

3

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

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

যে কোনও ম্যাকস এক্স বা আইওএস বিকাশকারী প্রথমটি শিখেন তা হল কীভাবে রেফারেন্স চক্র পরিচালনা করতে হয়, তাই এটি প্রকৃত বিকাশকারীদের পক্ষে সমস্যা নয়।


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

কেন আবর্জনা সংগ্রহকারী যে
জিনিসটি

ওহ হ্যাঁ, এটিও করবে। আপনি শেষ পর্যন্ত কেন খুঁজে পেয়েছেন?
প্রতিলিপি

হ্যাঁ, এটি অনেকগুলি ইউনিক্স ফাংশনগুলির মধ্যে একটি যেখানে আপনি একটি "প্রসঙ্গ" হিসাবে একটি শূন্যতা পাস করেন যা তারপরে একটি কলব্যাক ফাংশনে আপনাকে ফিরিয়ে দেওয়া হয়; শূন্য * সত্যই একটি উদ্দেশ্যমূলক-সি অবজেক্ট ছিল এবং আবর্জনা সংগ্রহকারী বুঝতে পারেনি যে ইউনিক্স কলটিতে এই বস্তুটি দূরে সরিয়ে রাখা হয়েছে। কলব্যাক বলা হয়, কাস্ট করে বাতিল * * অবজেক্ট *, কবুম!
gnasher729

2

সি ++ এ আবর্জনা সংগ্রহের বৃহত্তম অসুবিধা হ'ল এটি সঠিকভাবে পাওয়া অসম্ভব:

  • সি ++ এ, পয়েন্টারগুলি তাদের নিজের প্রাচীরযুক্ত সম্প্রদায়গুলিতে বাস করে না, তারা অন্যান্য ডেটার সাথে মিশ্রিত হয়। যেমন, আপনি অন্য ডেটা থেকে কোনও পয়েন্টারকে পৃথক করতে পারবেন না যা কিছুটা প্যাটার্নে বৈধ পয়েন্টার হিসাবে ব্যাখ্যা করা যায় be

    ফলাফল: যে কোনও সি ++ আবর্জনা সংগ্রহকারী সংগ্রহ করতে হবে এমন জিনিসগুলি ফাঁস করবে।

  • সি ++ তে আপনি পয়েন্টারগুলি বের করতে পয়েন্টার গাণিতিক করতে পারেন। যেমন, আপনি যদি কোনও ব্লক শুরুর দিকে কোনও পয়েন্টার খুঁজে না পান, তার অর্থ এই নয় যে সেই ব্লকটি রেফারেন্স করা যায় না।

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

    দ্রষ্টব্য: কোনও সি ++ আবর্জনা সংগ্রহকারী এই জাতীয় কৌশলগুলির সাথে কোডটি পরিচালনা করতে পারবেন না:

    int* array = new int[7];
    array--;    //undefined behavior, but people may be tempted anyway...
    for(int i = 1; i <= 7; i++) array[i] = i;
    

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


2
" এগুলি অন্যান্য ডেটার সাথে মিশ্রিত হয় " "এটি এত বেশি নয় যে তারা অন্যান্য ডেটার সাথে" মিশ্রিত "হয়ে থাকে। পয়েন্টার কী এবং কী নয় তা দেখতে সি ++ টাইপ সিস্টেমটি ব্যবহার করা সহজ। সমস্যাটি হ'ল পয়েন্টারগুলি প্রায়শই অন্যান্য ডেটা হয়ে যায় । একটি পূর্ণসংখ্যার মধ্যে পয়েন্টারটি লুকানো দুর্ভাগ্যক্রমে অনেকগুলি সি-স্টাইলের API এর জন্য সাধারণ সরঞ্জাম।
নিকল বোলাস

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

@ বিডব্যাট "এমনকি"? এর মতো কোনও ফাইলে পয়েন্টার লিখে কিছুটা মনে হচ্ছে ... অনেকটা দূরের। যাইহোক, একই গুরুতর সমস্যা পয়েন্টারগুলিকে স্ট্যাক করার জন্য জর্জরিত করে, আপনি কোডের অন্য কোথাও ফাইল থেকে পয়েন্টারটি পড়লে সেগুলি চলে যেতে পারে! অবৈধ পয়েন্টার মানটি ডিসরিয়াজ করা অনির্ধারিত আচরণ, এটি করবেন না।
হাইড

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

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