স্ট্রস্ট্রস্ট্র 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 মেমরি পরিচালনার ক্ষেত্রে অন্যান্য অনেক ভাষার চেয়ে খাটো, সহজেই পঠনযোগ্য এবং সহজ-শেখানো।