- আমি জানি ফাংশনগুলির অনেকগুলি উদাহরণ রয়েছে যা কখনই নিক্ষেপ করবে না, তবে যার জন্য সংকলক এটি নিজেই তা নির্ধারণ করতে পারে না। এই জাতীয় সমস্ত ক্ষেত্রে আমার কি ফাংশন ঘোষণার বাইরে নথী যুক্ত করা উচিত?
noexcept
এটি জটিল, কারণ এটি ফাংশন ইন্টারফেসের অংশ। বিশেষত, আপনি যদি একটি গ্রন্থাগার লিখছেন তবে আপনার ক্লায়েন্ট কোডটি noexcept
সম্পত্তির উপর নির্ভর করতে পারে । এটি পরে পরিবর্তন করা কঠিন হতে পারে কারণ আপনি বিদ্যমান কোডটি ভেঙে যেতে পারেন। আপনি যখন কেবলমাত্র আপনার অ্যাপ্লিকেশন দ্বারা ব্যবহৃত কোড প্রয়োগ করছেন তখন এটি কোনও উদ্বেগের বিষয় হতে পারে না।
আপনার যদি এমন কোনও ফাংশন থাকে যা ছোঁড়াতে পারে না, নিজেকে জিজ্ঞাসা করুন এটি থাকা পছন্দ করবে noexcept
বা ভবিষ্যতের বাস্তবায়নগুলিকে সীমাবদ্ধ করবে? উদাহরণস্বরূপ, আপনি ব্যতিক্রম নিক্ষেপ করে (যেমন, ইউনিট পরীক্ষার জন্য) অবৈধ যুক্তিগুলির ত্রুটি পরীক্ষার প্রবর্তন করতে চাইতে পারেন বা আপনি অন্যান্য লাইব্রেরি কোডের উপর নির্ভর করতে পারেন যা এর ব্যতিক্রমের বিশদটি পরিবর্তন করতে পারে। সেক্ষেত্রে রক্ষণশীল এবং বাদ দেওয়া আরও নিরাপদ noexcept
।
অন্যদিকে, যদি আপনি আত্মবিশ্বাসী হন যে ফাংশনটি কখনই ছুঁড়ে ফেলা উচিত নয় এবং এটি সঠিক যে এটি নির্দিষ্টকরণের অংশ, এটি আপনার ঘোষণা করা উচিত noexcept
। তবে, মনে রাখবেন যে noexcept
আপনার বাস্তবায়ন পরিবর্তন হলে সংকলক লঙ্ঘন সনাক্ত করতে সক্ষম হবে না ।
- কোন অবস্থার জন্য নোসেপ্ট ব্যবহার সম্পর্কে আমার আরও যত্নবান হওয়া উচিত এবং কোন পরিস্থিতিতে আমি নিহিত নোটিসপেক্ট (মিথ্যা) দিয়ে দূরে যেতে পারি?
চারটি ক্রিয়াকলাপ রয়েছে যা আপনার মনোনিবেশ করা উচিত কারণ সেগুলি সম্ভবত সবচেয়ে বেশি প্রভাব ফেলবে:
- অপারেশন সরান (অ্যাসাইনমেন্ট অপারেটর এবং মুভ কনস্ট্রাক্টরগুলি সরান)
- অদলবদল অপারেশন
- মেমরি deallocators (অপারেটর মুছুন, অপারেটর মুছুন [])
- ডেস্ট্রাক্টর (যদিও এগুলি নিখুঁতভাবে তৈরি করা হয়
noexcept(true)
যদি না আপনি এগুলি তৈরি করেন noexcept(false)
)
এই ফাংশনগুলি সাধারণত হওয়া উচিত noexcept
এবং সম্ভবত গ্রন্থাগার প্রয়োগগুলি noexcept
সম্পত্তিটি ব্যবহার করতে পারে । উদাহরণস্বরূপ, std::vector
শক্তিশালী ব্যতিক্রম গ্যারান্টি ছাড়াই নিক্ষেপকারী মুভ অপারেশনগুলি ব্যবহার করতে পারেন। অন্যথায়, এটি অনুলিপি করার উপাদানগুলিতে ফিরে যেতে হবে (যেমন এটি সি ++ 98 তে হয়েছিল)।
এই ধরণের অপ্টিমাইজেশানটি অ্যালগরিদমিক স্তরে রয়েছে এবং সংকলক অপ্টিমাইজেশনের উপর নির্ভর করে না। এটির উল্লেখযোগ্য প্রভাব থাকতে পারে, বিশেষত যদি উপাদানগুলি অনুলিপি করা ব্যয় হয়।
- আমি কখনই বাস্তবতার বাইরে নোকেপসেট ব্যবহার করার পরে কোনও পারফরম্যান্সের উন্নতি পর্যবেক্ষণের আশা করতে পারি? বিশেষত, কোডটির একটি উদাহরণ দিন যার জন্য একটি সি ++ সংকলক নোটসেপ্ট যুক্ত হওয়ার পরে আরও ভাল মেশিন কোড উত্পন্ন করতে সক্ষম।
noexcept
কোনও ব্যতিক্রমের নির্দিষ্টকরণের বিপরীতে বা সুবিধাটি throw()
হ'ল মানকটি যখন কম্পাইলারদের অবিচ্ছিন্ন স্ট্যাকের দিকে আসে তখন আরও বেশি স্বাধীনতার অনুমতি দেয়। এমনকি throw()
ক্ষেত্রে, সংকলকটিকে স্ট্যাকটিকে সম্পূর্ণভাবে আনইন্ডাইন্ড করতে হবে (এবং এটি অবজেক্ট কনস্ট্রাকশনগুলির সঠিক বিপরীত ক্রমে এটি করতে হবে)।
ইন noexcept
মামলা, অন্য দিকে, এটা যে কি প্রয়োজন হয় না। কোনও প্রয়োজন নেই যে স্ট্যাকটি আনওয়াউন্ডে থাকতে হবে (তবে সংকলকটি এখনও এটি করার অনুমতিপ্রাপ্ত)। এই স্বাধীনতাটি আরও কোড অপ্টিমাইজেশনকে মঞ্জুরি দেয় কারণ এটি সর্বদা স্ট্যাকটি খুলে ফেলতে সক্ষম হওয়ার ওভারহেডকে কম করে।
নোসেপ্ট, স্ট্যাক আনওয়াইন্ডিং এবং পারফরম্যান্স সম্পর্কিত সম্পর্কিত প্রশ্ন ওভারহেড সম্পর্কে আরও বিশদে চলে যায় যখন স্ট্যাক আনওয়াইন্ডিং প্রয়োজন হয়।
আমি স্কট মায়ার্স "কার্যকর আধুনিক সি ++" বইয়েরও পরামর্শ দিচ্ছি, "আইটেম 14: ফাংশনগুলি ঘোষণা করুন যদি তারা ব্যাতীতভাবে ছাড়বে না" তবে আরও পড়ার জন্য।
move_if_nothrow
কোডগুলি (বা হোয়াটম্যাকালিট) ব্যবহার করে সেগুলি যদি কোনও ননডেসেপ্ট মুভ কর্টর থাকে তবে একটি পারফরম্যান্স উন্নতি দেখতে পাবেন।