সি ++ এর কেন আবর্জনা সংগ্রহকারী নেই?


269

আমি প্রথমে আবর্জনা সংগ্রহের যোগ্যতার কারণে এই প্রশ্নটি করছি না। এটি জিজ্ঞাসা করার আমার প্রধান কারণটি হ'ল আমি জানি যে বাজনে স্ট্রস্ট্রপ বলেছে যে সি ++ এর কোনও সময় কোনও আবর্জনা সংগ্রহকারী থাকবে।

এর সাথে, কেন এটি যুক্ত করা হয়নি? ইতিমধ্যে সি ++ এর জন্য কিছু আবর্জনা সংগ্রহকারী রয়েছে। টাইপ জিনিসগুলির মধ্যে এটি কি "সম্পন্নের চেয়ে সহজ বলেছিলেন"? অথবা এটি যুক্ত না হওয়ার অন্যান্য কারণ রয়েছে (এবং সি ++ 11 এ যোগ করা হবে না)?

ক্রস লিঙ্কগুলি:

কেবল স্পষ্ট করে বলতে গেলে, আমি যখন প্রথমবার তৈরি হয়েছিল তখন কেন সি ++ এর আবর্জনা সংগ্রহকারী নেই। আমি ভাবছি কেন সংগ্রাহককে যুক্ত করা যায় না।


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

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

4
@ ডেভর - আমি কোনও সি ++ বিদ্বেষী নই বা এমনকি আমি এমন যুক্তি দেওয়ার চেষ্টাও করছি যে সি ++ এর কোনও আবর্জনা সংগ্রহকারী দরকার। আমি জিজ্ঞাসা করছি কারণ আমি জানি যে বর্জন স্ট্রস্ট্রপ বলেছে যে এটি যুক্ত করা হবে এবং এটি বাস্তবায়ন না করার কারণগুলি কি কি আগ্রহী ছিল।
জেসন বেকার

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

1
@ আরগারডপ্যাক: তবে এখনই এটি এতটা কার্যকর নয় (আমার উত্তর দেখুন ...) সুতরাং এটি বাস্তবায়নের কোনও সম্ভাবনা নেই having
einpoklum

উত্তর:


159

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

নিজেই বাজরেন স্ট্রস্ট্রপের একটি উক্তি:

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

সেখানে বিষয়ে একটি ভাল আলোচনা এখানে

সাধারণ ওভারভিউ:

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

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

এখানে 2 ধরণের আবর্জনা সংগ্রহ করা ...

স্পষ্ট আবর্জনা সংগ্রহ:

সি ++ 0x এর শেয়ারড_পিটার দিয়ে তৈরি পয়েন্টারগুলির মাধ্যমে আবর্জনা সংগ্রহ করতে হবে

আপনি যদি এটি চান তবে আপনি এটি ব্যবহার করতে পারবেন, যদি আপনি এটি না চান তবে আপনাকে এটি ব্যবহার করতে বাধ্য করা হবে না।

আপনি বর্তমানে বুস্ট: শেয়ারড_পিটার ব্যবহার করতে পারেন যদি আপনি সি ++ 0 এক্সের জন্য অপেক্ষা না করতে চান তবে।

জড়িত আবর্জনা সংগ্রহ:

যদিও এটিতে স্বচ্ছ আবর্জনা সংগ্রহ নেই। যদিও এটি ভবিষ্যতের সি ++ স্পেসগুলির জন্য একটি ফোকাস পয়েন্ট হবে।

কেন Tr1 এর অন্তর্নিহিত আবর্জনা সংগ্রহ নেই?

সি ++ 0 এক্স এর টিআর 1 থাকা উচিত ছিল এমন অনেকগুলি বিষয় রয়েছে, পূর্বের সাক্ষাত্কারগুলিতে বার্জন স্ট্রোস্ট্রুপ বলেছিলেন যে টিআর 1 তার পছন্দ মতো ছিল না।


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

26
@ ইউনিক্সমান ৩৩: রেফারেন্স গণনা করা আবর্জনা সংগ্রহের প্রধান সমস্যা (অর্থাত্ std::shared_ptr) চক্রীয় রেফারেন্স, যা স্মৃতিশক্তি ফুটো হওয়ার কারণ। অতএব আপনার অবশ্যই std::weak_ptrচক্র ভাঙ্গতে সাবধানতার সাথে ব্যবহার করতে হবে , যা অগোছালো। মার্ক এবং সুইপ স্টাইলের জিসিতে এই সমস্যা নেই। থ্রেডিং / কাঁটাচামচ এবং আবর্জনা সংগ্রহের মধ্যে কোনও সহজাত অসামঞ্জস্যতা নেই। জাভা এবং সি # উভয়েরই উচ্চ কার্যকারিতা প্রিমিটিভ মাল্টিথ্রেডিং এবং এবং একটি আবর্জনা সংগ্রহকারী রয়েছে। রিয়েলটাইম অ্যাপ্লিকেশন এবং কোনও আবর্জনা সংগ্রাহককে নিয়ে কাজ করার বিষয় রয়েছে, কারণ বেশিরভাগ আবর্জনা সংগ্রাহককে বিশ্ব চালানোর জন্য থামাতে হয়।
অ্যান্ড্রু তোমাজোস

9
"রেফারেন্স গণনা করা আবর্জনা সংগ্রহের সাথে প্রধান সমস্যা (অর্থাত্ std::shared_ptr) চক্রীয় রেফারেন্স" এবং ভয়াবহ কার্য সম্পাদন যা বিড়ম্বনাজনক
জন হ্যারোপ

11
"আপনি কীভাবে নিম্ন স্তরের ইউনিক্স স্টাইল কাঁটাচামচ করবেন"? ওসি ক্যামেলের মতো জিসি'ড ভাষাগুলি ~ 20 বছর বা তারও বেশি সময় ধরে এটি করে চলেছে।
জন হ্যারোপ

9
"পাইথনের গ্লোবাল ইন্টারপ্রেটার লক রয়েছে বেশিরভাগ ক্ষেত্রে এটি আবর্জনা সংগ্রহের কারণে"। স্ট্রোম্যান যুক্তি। জাভা এবং .NET উভয়েরই জিসি রয়েছে তবে উভয়ের গ্লোবাল লক নেই।
জন হ্যারোপ

149

এখানে বিতর্ক যোগ করতে।

আবর্জনা সংগ্রহের সাথে পরিচিত সমস্যাগুলি রয়েছে এবং সেগুলি বোঝার ফলে সি ++ এ কেন নেই তা বুঝতে সহায়তা করে।

1. পারফরম্যান্স?

প্রথম অভিযোগটি প্রায়শই পারফরম্যান্স সম্পর্কে হয় তবে বেশিরভাগ লোকেরা আসলে তারা বুঝতে পারে না যে তারা কী সম্পর্কে কথা বলছে। Martin Beckettসমস্যার দ্বারা চিত্রিত হিসাবে প্রতি সেফ পারফরম্যান্স নাও হতে পারে, তবে পারফরম্যান্সের পূর্বাভাস।

জিসির বর্তমানে 2 টি পরিবার রয়েছে যা ব্যাপকভাবে মোতায়েন রয়েছে:

  • মার্ক-অ্যান্ড-সুইপ ধরনের
  • রেফারেন্স-গণনা ধরনের

Mark And Sweepদ্রুত (সামগ্রিক কর্মক্ষমতা কম প্রভাব) হল কিন্তু এটি একটি "বিশ্বের বরফে পরিণত করা" সিন্ড্রোম ভুগছেন: অর্থাত যখন জিসি কিক, অন্য সব কিছুর পর্যন্ত জিসি তার পরিষ্করণ করেছেন বন্ধ থাকে। আপনি যদি এমন একটি সার্ভার তৈরি করতে চান যা কয়েক মিলিসেকেন্ডে উত্তর দেয় ... কিছু লেনদেন আপনার প্রত্যাশাগুলির সাথে মিলিত হবে না :)

সমস্যাটি Reference Countingভিন্ন: রেফারেন্স-কাউন্টিং ওভারহেড যুক্ত করে, বিশেষত মাল্টি-থ্রেডিং পরিবেশে কারণ আপনার একটি পারমাণবিক গণনা করা দরকার। তদুপরি রেফারেন্স চক্রের সমস্যা রয়েছে সুতরাং সেই চক্রগুলি সনাক্ত করতে এবং সেগুলি নির্মূল করার জন্য আপনার একটি চৌকস অ্যালগরিদম প্রয়োজন (সাধারণত ঘন ঘন হলেও "বিশ্বকে স্থির করুন" প্রয়োগ করুন)। সাধারণভাবে, আজকের মতো, এই ধরণের (যদিও সাধারণত আরও বেশি প্রতিক্রিয়াশীল বা বরং কম প্রায়ই জমা হওয়া) এর চেয়ে ধীর Mark And Sweep

আমি আইফেল প্রয়োগকারীদের একটি কাগজ দেখেছি যা কোনও Reference Countingআবর্জনা সংগ্রাহককে বাস্তবায়নের চেষ্টা করছিল Mark And Sweepযা "বিশ্বকে হিমায়িত করা" দিক ছাড়া একইরকম বৈশ্বিক পারফরম্যান্স পেতে পারে । জিসির (সাধারণ) জন্য এটির জন্য পৃথক থ্রেড প্রয়োজন। অ্যালগরিদমটি কিছুটা ভীতিজনক ছিল (শেষে) তবে কাগজটি একবারে ধারণাগুলি প্রবর্তন এবং "সাধারণ" সংস্করণ থেকে পূর্ণাঙ্গটির সাথে অ্যালগরিদমের বিবর্তন দেখানোর পক্ষে একটি ভাল কাজ করে। প্রস্তাবিত পড়া কেবল যদি আমি পিডিএফ ফাইলে হাত রাখতে পারতাম ...

২. সম্পদ অর্জন অধিগ্রহণ (আরআইআইআই)

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

  • লকস (বহু-থ্রেড, ফাইল হ্যান্ডেল, ...)
  • সংযোগ (একটি ডাটাবেসে, অন্য সার্ভারে, ...)

ধারণাটি হ'ল বস্তুর আজীবন সঠিকভাবে নিয়ন্ত্রণ করা:

  • এটি যতক্ষণ আপনার প্রয়োজন ততক্ষণ বেঁচে থাকা উচিত
  • এটি শেষ হয়ে গেলে এটি মেরে ফেলা উচিত

জিসির সমস্যা হ'ল এটি যদি পূর্বের সাথে সহায়তা করে এবং শেষ পর্যন্ত গ্যারান্টি দেয় যে পরে ... এই "চূড়ান্ত" পর্যাপ্ত নাও হতে পারে। আপনি যদি কোনও লক প্রকাশ করেন তবে আপনি সত্যিই চাইবেন যে এটি এখনই মুক্তি দেওয়া হবে, যাতে এটি আর কোনও কলকে আটকে না দেয়!

জিসির সাথে দুটি ভাষার কাজ প্রায় রয়েছে:

  • যখন স্ট্যাক বরাদ্দ পর্যাপ্ত থাকে তখন জিসি ব্যবহার করবেন না: এটি সাধারণত পারফরম্যান্স সমস্যার ক্ষেত্রে হয় তবে আমাদের ক্ষেত্রে এটি সত্যই সহায়তা করে যেহেতু সুযোগটি আজীবন সংজ্ঞা দেয়
  • usingনির্মাণ করুন ... তবে এটি C ++ RAII এ থাকা অবস্থায় স্পষ্ট (দুর্বল) RAII যাতে অন্তর্ভুক্ত থাকে যাতে ব্যবহারকারী অনিচ্ছাকৃতভাবে ত্রুটি করতে পারে না ( usingকীওয়ার্ড বাদ দিয়ে )

৩. স্মার্ট পয়েন্টার

স্মার্ট পয়েন্টারগুলি প্রায়শই মেমরিটি হ্যান্ডল করার জন্য সিলভার বুলেট হিসাবে উপস্থিত হয় C++। প্রায়শই আমি শুনেছি: আমাদের সর্বোপরি জিসির দরকার নেই, যেহেতু আমাদের স্মার্ট পয়েন্টার রয়েছে।

একটিও এর চেয়ে বেশি ভুল হতে পারে না।

স্মার্ট পয়েন্টারগুলি সাহায্য করে: auto_ptrএবং unique_ptrRAII ধারণাটি ব্যবহার করে, অত্যন্ত কার্যকর। এগুলি এত সহজ যে আপনি এগুলি নিজের দ্বারা সহজেই লিখতে পারেন।

যখন কারও মালিকানা ভাগ করে নেওয়া দরকার তবে তা আরও কঠিন হয়ে পড়ে: আপনি একাধিক থ্রেডের মধ্যে ভাগ করে নিতে পারেন এবং গণনা পরিচালনা করার সাথে কয়েকটি সূক্ষ্ম সমস্যা রয়েছে। সুতরাং, এক স্বাভাবিকভাবে দিকে দিকে যায় shared_ptr

এটি দুর্দান্ত, সর্বোপরি এটিই বুস্ট, তবে এটি রূপালী বুলেট নয়। প্রকৃতপক্ষে, মূল সমস্যাটি shared_ptrহ'ল এটি প্রয়োগ করা একটি জিসি অনুকরণ করে Reference Countingতবে আপনার নিজের দ্বারা চক্র সনাক্তকরণটি সমস্ত প্রয়োগ করতে হবে ... urg

অবশ্যই এই weak_ptrজিনিসটি আছে, তবে দুর্ভাগ্যক্রমে আমি ইতিমধ্যে স্মৃতি ফাঁস দেখেছি shared_ptrthose চক্রগুলির কারণে সত্ত্বেও ... এবং আপনি যখন একাধিক থ্রেডযুক্ত পরিবেশে আছেন তখন এটি সনাক্ত করা খুব কঠিন!

৪. সমাধান কী?

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

  • সম্ভব হলে একটি নির্দিষ্ট সময়ে একক মালিককে পছন্দ করুন prefer
  • যদি তা না হয় তবে নিশ্চিত হয়ে নিন যে আপনার শ্রেণীর চিত্রের মালিকানা সম্পর্কিত কোনও চক্র নেই এবং তাদের সূক্ষ্ম প্রয়োগের সাথে সেগুলি ভেঙে দেয় weak_ptr

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


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

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

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

3
আপনি সবেমাত্র একটি মূলধারার ভাষার নাম দিয়েছেন যা তিনটি ব্যবহার করেছে।
আমার সঠিক মতামতটি ঠিক

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

56

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

সি / সি ++ কেবলমাত্র অনেকগুলি বিভিন্ন পরিস্থিতিতে ব্যবহৃত হয়। আমি সন্দেহ করি যে স্মার্ট পয়েন্টার বাড়ানোর মতো কিছু বেশিরভাগ ব্যবহারকারীর পক্ষে যথেষ্ট

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


6
আমি অবশ্যই আপনার বক্তব্যটি দেখতে পাচ্ছি, তবে আমি জিজ্ঞাসা করতে বাধ্য হতে পারি: জাভা কি প্রায় অ্যাপ্লিকেশন হিসাবে ব্যবহৃত হয় না?
জেসন বেকার

35
জাভা উচ্চ পারফরম্যান্স অ্যাপ্লিকেশনগুলির জন্য উপযুক্ত নয়, সাধারণ কারণে যে এটির সি ++ এর সমান পারফরম্যান্স গ্যারান্টি নেই। সুতরাং আপনি এটি একটি সেল ফোনে খুঁজে পাবেন, তবে আপনি এটি সেল স্যুইচ বা সুপার কম্পিউটারে পাবেন না।
জাথরাস

11
আপনি সর্বদা আরও সার্ভার কিনতে পারেন, তবে আপনি ইতিমধ্যে গ্রাহকের পকেটে থাকা সেল ফোনের জন্য আরও বেশি সিপিইউ কিনতে পারবেন না!
ক্র্যাশ ওয়ার্কস

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

2
@ জাথ্রুস জাভা অপ্টিমাইজিং জিটের থ্রুটপুট বি / সি তে বিজয়ী হতে পারে, যদিও বিলম্বিতা নয় (রিয়েল-টাইম বুও), এবং অবশ্যই মেমরির পদচিহ্ন নয়।
gtrak

34

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

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

এই সমস্যাগুলির মধ্যে কয়েকটি মাত্র।


17
জিজার এবং ডিসস্ট্রাক্টরগুলি হ'ল একটি সমাধান সমস্যা, এটি বাজার্নের একটি সুন্দর পার্শ্বচালনা দ্বারা। জিসি চলাকালীন ডেস্ট্রাক্টররা চালায় না, কারণ এটি জিসির মূল বিষয় নয়। অসীম স্মৃতি ধারণার জন্ম দেওয়ার জন্য সি ++ তে জিসি বিদ্যমান , অন্য অসম্পূর্ণ সম্পদ নয়।
এমসাল্টারস

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

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

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

22

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

বিশেষত, বাস্তবায়ন কীভাবে আচরণটি অর্জন করে তার পরিবর্তে সি ++ স্ট্যান্ডার্ডটি বাহ্যিকভাবে পর্যবেক্ষণযোগ্য আচরণের ক্ষেত্রে ভাষা নির্দিষ্ট করতে যথেষ্ট সতর্ক। আবর্জনা সংগ্রহের ক্ষেত্রে, তবে হয় কার্যত কোন বাহ্যিকভাবে পর্যবেক্ষণযোগ্য আচরণ।

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

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

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

তবুও, এটি সি ++ এর জন্য প্রস্তাবিত চেয়ে শক্তিশালী। পূর্ববর্তী প্রস্তাব [সতর্কতা: পিডিএফ] (যে বাদ পড়ে) এ সব গ্যারান্টি কিছুই করেনি। ২৮ পৃষ্ঠার প্রস্তাবনায়, আপনি বাহ্যিকভাবে পর্যবেক্ষণযোগ্য আচরণের পথে যা পেয়েছেন তা হ'ল একক (নন-আদর্শিক) নোট যা বলেছেন:

[দ্রষ্টব্য: আবর্জনা সংগৃহীত প্রোগ্রামগুলির জন্য, একটি উচ্চ মানের হোস্টেড প্রয়োগকরণের এটি পুনরারামযোগ্য মেমরির পরিমাণ সর্বাধিক করার চেষ্টা করা উচিত। অন্তর্ভুক্ত নোট]

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

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

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


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

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

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

@ অ্যারোনম্যাকডেইড এটি সত্য যে জিসি অ-মেমরির সংস্থানগুলিতে মোটেই সহায়তা করে না। ভাগ্যক্রমে, এ জাতীয় সংস্থানগুলি স্মৃতির তুলনায় খুব কমই বরাদ্দ পাওয়া যায়। তদুপরি, তাদের 90% এরও বেশি লোককে যে পদ্ধতিতে বরাদ্দ দেওয়া হয়েছিল সেগুলি থেকে মুক্ত করা যেতে পারে, সুতরাং try (Whatever w=...) {...}এটি সমাধান করে (এবং আপনি যখন ভুলে যান তখন আপনি একটি সতর্কতা পান)। বাকিগুলিও RAII নিয়ে সমস্যাযুক্ত। close()"সর্বকালে" কল করার অর্থ হতে পারে প্রতি দশ হাজার লাইনে একবার একবার, সুতরাং এটি এতটা খারাপ নয়, যখন প্রতিটি জাভা লাইনে মেমরি প্রায় বরাদ্দ হয়ে যায়।
মার্টিনাস

15

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

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

সূত্র: http://www.stroustrup.com/bs_faq.html#garbage-colલેક્શન

এটি কেন এটি নির্মাণ করে নি, এটি যদি আমি সঠিকভাবে মনে করি তবে এটি জিসি জিনিসটির আগে আবিষ্কার করা হয়েছিল , এবং আমি বিশ্বাস করি না যে ভাষাটি বেশ কয়েকটি কারণে জিসির সাথে থাকতে পারে (IE এর পিছনে সিটির সাথে সামঞ্জস্যপূর্ণ)

আশাকরি এটা সাহায্য করবে.


"এমন একটি পারফরম্যান্স যা অন্য আবর্জনা সংগ্রহ করা ভাষার সাথে অনুকূলভাবে তুলনা করে"। উদ্ধৃতি?
জন হ্যারোপ

1
আমার লিঙ্কটি ভেঙে গেছে। আমি এই উত্তরটি 5 বছর আগে লিখেছি।
রায়নে

1
ঠিক আছে, আমি এই দাবিগুলির কিছু স্বতন্ত্র যাচাইয়ের জন্য আশা করছিলাম, যেমন স্ট্রোস্ট্রপ বা বোহেম দ্বারা নয়। :-)
জন হ্যারোপ

12

স্ট্রস্ট্রস্ট্র 2013 এ যাচ্ছেন নেটিভ সম্মেলনে এ সম্পর্কে কিছু ভাল মন্তব্য করেছেন।

এই ভিডিওটিতে কেবল 25m50s এ যান । (আমি পুরো ভিডিওটি বাস্তবে দেখার প্রস্তাব দিই, তবে আবর্জনা সংগ্রহের বিষয়ে এড়িয়ে যায়))

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

আধুনিক সি ++, এবং আমাদের সি ++ 11 এ থাকা স্টাফ দিয়ে, আবর্জনা সংগ্রহ সীমিত পরিস্থিতিতে বাদে আর কাঙ্ক্ষিত নয়। প্রকৃতপক্ষে, এমনকি যদি কোনও ভাল জঞ্জাল সংগ্রহকারী অন্যতম প্রধান সি ++ সংকলকগুলির মধ্যে অন্তর্নির্মিত হয় তবে আমি মনে করি এটি খুব বেশি ব্যবহৃত হয় না। এটা হতে হবে সহজ , কঠিন না, জিসি এড়ানো।

তিনি এই উদাহরণটি দেখান:

void f(int n, int x) {
    Gadget *p = new Gadget{n};
    if(x<100) throw SomeException{};
    if(x<200) return;
    delete p;
}

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

তাহলে সমাধান কী? কয়েকটি পন্থা আছে। স্পষ্ট পদ্ধতির, যা আপনি আপনার বস্তুর বিশাল অংশের জন্য ব্যবহার করবেন:

void f(int n, int x) {
    Gadget p = {n};  // Just leave it on the stack (where it belongs!)
    if(x<100) throw SomeException{};
    if(x<200) return;
}

এটি টাইপ করতে কম অক্ষর লাগে। এটি উপায় হয় না new। এটিতে আপনার Gadgetদুবার টাইপ করার দরকার নেই । ফাংশনটির শেষে অবজেক্টটি ধ্বংস হয়ে যায়। এটি যদি আপনি চান তবে এটি খুব স্বজ্ঞাত। Gadgetহিসাবে একই আচরণ গুলি intবা double। অনুমানযোগ্য, সহজেই পঠনযোগ্য, সহজ-শেখানো। সব কিছুই একটি 'মান' ' কখনও কখনও একটি বড় মান, তবে মানগুলি শেখানো সহজ হয় কারণ আপনি পয়েন্টার (বা রেফারেন্স) দিয়ে যে জিনিসটি 'দূরত্বে এ্যাকশন' করেন না তা নেই।

আপনার তৈরি করা বেশিরভাগ বস্তু কেবল তাদের তৈরি করা ফাংশনে ব্যবহারের জন্য এবং সম্ভবত শিশু ফাংশনগুলির ইনপুট হিসাবে পাস হয়েছে uts প্রোগ্রামারকে অবজেক্টগুলি ফেরত দেওয়ার সময় 'মেমরি পরিচালনা' বা অন্যথায় সফ্টওয়্যারটির বিচ্ছিন্ন অংশে অবজেক্টগুলি ভাগ করে নেওয়ার বিষয়ে ভাবা উচিত নয়।

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

এটি দক্ষতার সমস্যার মতো মনে হতে পারে। আমি যদি কোনও গ্যাজেট থেকে ফিরে আসতে চাই তবে কী হবে foo()? সি ++ 11 এর পদক্ষেপ শব্দার্থকগুলি বড় বড় অবজেক্টগুলিকে ফিরে আসা সহজ করে তোলে। শুধু লিখুন Gadget foo() { ... }এবং এটি ঠিক কাজ করবে এবং দ্রুত কাজ করবে। আপনার &&নিজের সাথে জগাখিচির দরকার নেই , কেবল মূল্য দিয়ে জিনিসগুলি ফিরিয়ে দিন এবং ভাষা প্রায়শই প্রয়োজনীয় অপটিমাইজেশন করতে সক্ষম হবে। (সি ++ 03 এর আগেও, সংকলকগণ অপ্রয়োজনীয় অনুলিপি এড়ানোর ক্ষেত্রে উল্লেখযোগ্যভাবে ভাল কাজ করেছেন))

স্ট্রোস্ট্রুপ যেমন ভিডিওতে অন্য কোথাও বলেছিলেন (প্যারাফ্রেসিং): "কেবলমাত্র একজন কম্পিউটার বিজ্ঞানী কোনও বস্তু অনুলিপি করার জন্য এবং তারপরে মূলটি ধ্বংস করার জন্য জোর দিতেন। (কম্পিউটার বিজ্ঞানীরা নয়) আশা করেন। "

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

যদি এটি আপনার পক্ষে কাজ করে না, আপনি ব্যবহার করতে পারেন unique_ptrবা এটি ব্যর্থ করতে পারেন shared_ptr। ভাল লেখা সি ++ 11 মেমরি পরিচালনার ক্ষেত্রে অন্যান্য অনেক ভাষার চেয়ে খাটো, সহজেই পঠনযোগ্য এবং সহজ-শেখানো।


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

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

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

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

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

11

কারণ আধুনিক সি ++ এর আবর্জনা সংগ্রহের প্রয়োজন নেই।

এই বিষয়ে বার্জন স্ট্রস্ট্রপের FAQ এর উত্তর বলে :

আমি আবর্জনা পছন্দ করি না আমি জঞ্জাল পছন্দ করি না আমার আদর্শ হ'ল কোনও আবর্জনা তৈরি না করে কোনও আবর্জনা সংগ্রহকারীর প্রয়োজনীয়তা দূর করা। এটা এখন সম্ভব।


এই দিনগুলিতে লিখিত কোডের জন্য পরিস্থিতি (সি ++ 17 এবং অফিসিয়াল কোর গাইডলাইনস অনুসরণ করে) নিম্নরূপ:

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

"ওহ হ্যাঁ? তবে কি ...

... আমি কি কেবল কোড লিখি যেভাবে আমরা পুরানো দিনগুলিতে সি ++ লিখতাম? "

তোমরা তো পারে শুধু নির্দেশিকা সব উপেক্ষা এবং ছিদ্রময় আবেদন কোড লিখতে - এবং এটি কম্পাইল এবং চালানোর (এবং লিক), সবসময় হিসাবে একই হবে।

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

... আমি যদি reintrepret_cast? না জটিল পয়েন্টার গাণিতিক? নাকি এ জাতীয় অন্য হ্যাক? "

প্রকৃতপক্ষে, যদি আপনি এটির প্রতি মনোনিবেশ করেন তবে আপনি এমন কোড লিখতে পারেন যা নির্দেশিকাগুলির সাথে দুর্দান্ত খেলেও জিনিসগুলি গোলমেলে। কিন্তু:

  1. আপনি এটি খুব কমই করবেন (কোডের জায়গাগুলির ক্ষেত্রে কার্যকরভাবে কার্যকর করার সময়টির ভগ্নাংশের ক্ষেত্রে প্রয়োজনীয় নয়)
  2. আপনি কেবল এটি ইচ্ছাকৃতভাবে করবেন, দুর্ঘটনাক্রমে নয়।
  3. এটি করার ফলে নির্দেশিকাগুলি মেনে চলার কোডবেসে দাঁড়াবে।
  4. এটি এমন এক ধরণের কোড যা আপনি অন্য কোনও ভাষায় জিসিকে বাইপাস করবেন।

... গ্রন্থাগারের উন্নয়ন? "

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


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

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


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

2
@ ব্যবহারকারী 1863152: এটি এমন একটি ক্ষেত্রে যাতে কাস্টম বরাদ্দকারী কার্যকর হবে। এটি এখনও কোনও ভাষা-অবিচ্ছেদ্য
জিসির

টু ইনপোকলুম: সত্য। এটি কোর্সের জন্য কেবল ঘোড়া। আমার প্রয়োজন ছিল পরিবহণ যাত্রীর তথ্যের গ্যালন পরিবর্তনশীল প্রক্রিয়া করা। আকর্ষণীয় বিষয় .. সত্যই সফ্টওয়্যার দর্শনে নেমে আসে।
www-0av-Com

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

10

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

কিছুই তৃতীয় পক্ষের আবর্জনা সংগ্রহ ব্যবস্থার সাথে আবদ্ধ এমন কিছু স্মার্ট পয়েন্টার ব্যবহার থেকে আপনাকে বাধা দেয় না। আমি মনে করি মাইক্রোসফ্ট COM এর সাথে এমন কিছু করছে এবং এটি ভাল হয় নি।


2
আমি মনে করি না জিসির একটি ভিএম দরকার। সংকলকটি বিশ্বব্যাপী রাষ্ট্র আপডেট করার জন্য সমস্ত পয়েন্টার ক্রিয়াকলাপগুলিতে কোড যুক্ত করতে পারে, যখন পৃথক থ্রেড পটভূমিতে প্রয়োজন অনুসারে মুছে ফেলা চালায়।
ব্যবহারকারী 83255

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


4

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

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

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


এটি একটি খুব ভাল পয়েন্ট, আমি সম্প্রতি আমার পয়েন্টারগুলি থেকে কিছু বিট চুরি করেছি কারণ অন্যথায় ক্যাশে মিস করার বোকামি পরিমাণ থাকবে amounts
পাসার

@ পাসবারবি: আমি আশ্চর্য হয়েছি যে 64-বিট পয়েন্টার ব্যবহার করে এমন কতগুলি অ্যাপ্লিকেশন হ'ল 32-বিট পয়েন্টারগুলিকে অবজেক্ট রেফারেন্স হিসাবে ব্যবহার করা বা অন্যথায় ঠিকানা স্পেসের 4GiB- এ রাখা এবং বিশেষত অবজেক্টগুলি উচ্চ থেকে ডেটা সঞ্চয় / পুনরুদ্ধারে ব্যবহার করা থেকে বেশি উপকৃত হবে? - স্পিড স্টোরেজ পেরিয়ে? মেশিনগুলিতে পর্যাপ্ত পরিমাণে র‌্যাম রয়েছে যা -৪-বিট পয়েন্টারগুলির র‍্যাম ব্যবহারের কোনও কারণ নেই, কেবল তারা 32-বিট পয়েন্টারের চেয়ে দ্বিগুণ ক্যাশে গাব্বল করে।
ক্যাট

3

সমস্ত প্রযুক্তিগত কথাবার্তা ধারণাটিকে আবদ্ধ করে তুলছে।

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

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

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

এই সমস্যাটি আরও বুঝতে, ভার্চুয়াল মেমরি এবং এটি কীভাবে কম্পিউটারে প্রয়োগ করা হয় তা সন্ধান করুন। এটি সত্য যে 2GB প্রোগ্রামে যখন তখন খুব বেশি র্যাম থাকে না তখন এটি উপলব্ধ। ৩২ বিবিআইটি সিস্টেমের জন্য 2 জিবি র‌্যামযুক্ত আধুনিক কম্পিউটারগুলিতে এমন সমস্যা নেই কেবলমাত্র একটি প্রোগ্রাম চালু রয়েছে।

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

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

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


3

সংক্ষিপ্ত উত্তর: আমরা কীভাবে দক্ষতার সাথে আবশ্যকভাবে আবর্জনা সংগ্রহ করতে পারি না (ক্ষুদ্র সময় এবং স্থানের ওভারহেড সহ) এবং সঠিকভাবে সর্বদা (সমস্ত সম্ভাব্য ক্ষেত্রে)।

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

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

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


3

যখন আমরা জাভার সাথে সি ++ তুলনা করি তখন আমরা দেখতে পাই যে জাভা থাকাকালীন জড়িত আবর্জনা সংগ্রহের সাথে সি ++ ডিজাইন করা হয়নি।

সি স্টাইলে নির্বিচারে পয়েন্টারগুলির মতো জিনিসগুলি রাখা কেবল জিসি-বাস্তবায়নের পক্ষে খারাপ নয়, তবে এটি প্রচুর পরিমাণে সি ++ - লেগ্যাসি কোডের পশ্চাদপদ সামঞ্জস্যতাও নষ্ট করে দেবে।

এগুলি ছাড়াও, সি ++ এমন একটি ভাষা যা জটিল রান-টাইম পরিবেশের পরিবর্তে স্বতন্ত্র এক্সিকিউটেবল হিসাবে চালানোর উদ্দেশ্যে তৈরি হয়।

সব মিলিয়ে: হ্যাঁ সি ++ এর সাথে আবর্জনা সংগ্রহ যুক্ত করা সম্ভব হতে পারে তবে ধারাবাহিকতার জন্য এটি না করাই ভাল।


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

0

মূলত দুটি কারণে:

  1. কারণ এটির কোনও দরকার নেই (আইএমএইচও)
  2. কারণ এটি RAII এর সাথে বেশ বেমানান, যা সি ++ এর মূল ভিত্তি

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


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

0

আবর্জনা সংগ্রহের চাপানো সত্যিই নিম্ন স্তরের উচ্চ স্তরের দৃষ্টান্তের শিফট।

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

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