আমি এই মুহুর্তে সি ++ শিখছি এবং খারাপ অভ্যাসগুলি বেছে নেওয়ার চেষ্টা করব। আমি যা বুঝতে পেরেছি তা থেকে ঝাঁকুনি-গুছিয়ে অনেকগুলি "সেরা অনুশীলন" রয়েছে এবং আমি তাদের যথাসম্ভব যথাযথভাবে আঁকড়ে ধরার চেষ্টা করি (যদিও তারা এখনও কেন ভাল বিবেচিত হয় তা আমি প্রয়োজনীয়ভাবে বুঝতে পারি না ) তবে আমি নিশ্চিত নই যে আমি এখানে প্রস্তাবিত কি বুঝতে।
আমি এই ক্লাসটি টিউটোরিয়াল থেকে ব্যবহার করেছি:
class Creature
{
private:
std::string m_name;
public:
Creature(const std::string &name)
: m_name{name}
{
}
};
এটি ঝনঝন-পরিচ্ছন্নতার একটি পরামর্শের দিকে পরিচালিত করে যে রেফারেন্স এবং ব্যবহারের পরিবর্তে মান দিয়ে আমার পাস করা উচিত std::move। যদি আমি এটি করি, আমি nameএকটি রেফারেন্স তৈরি করার পরামর্শটি পেয়েছি (এটি প্রতিবারের মতো অনুলিপি করা হয় না তা নিশ্চিত করার জন্য) এবং সতর্কবার্তাটির std::moveকোনও প্রভাব পড়বে না কারণ nameএটি constআমার অপসারণ করা উচিত।
আমি সতর্কতা না পাওয়ার একমাত্র উপায় হ'ল constসম্পূর্ণ অপসারণ :
Creature(std::string name)
: m_name{std::move(name)}
{
}
যৌক্তিক বলে মনে হয়, কারণ এর একমাত্র সুবিধাটি constছিল মূল স্ট্রিংয়ের সাথে জগাখিচু করা রোধ করা (যা ঘটেছিল না কারণ আমি মূল্য দিয়ে পাশ করেছি)। তবে আমি সিপ্লাসপ্লাস.কম এ পড়েছি :
যদিও নোট করুন যে-প্রমিত লাইব্রেরিতে- চলন্ত বোঝায় যে স্থানান্তরিত বস্তুটি একটি বৈধ তবে অনির্ধারিত অবস্থায় রেখে গেছে। যার অর্থ হ'ল, এই জাতীয় অপারেশনের পরে, স্থানান্তরিত বস্তুর মানটি কেবল ধ্বংস করা বা একটি নতুন মান নির্ধারণ করা উচিত; এটি অ্যাক্সেস অন্যথায় একটি অনির্ধারিত মান দেয়।
এখন এই কোডটি কল্পনা করুন:
std::string nameString("Alex");
Creature c(nameString);
যেহেতু nameStringমান দ্বারা পাস হয়ে যায়, std::moveকেবল nameকনস্ট্রাক্টরের অভ্যন্তরে অকার্যকর হবে এবং মূল স্ট্রিংটিকে স্পর্শ করবে না। তবে এর সুবিধা কী? দেখে মনে হচ্ছে বিষয়গুলি কেবল একবারই অনুলিপি করা হয়েছে - যদি আমি কল করার সময় m_name{name}যদি রেফারেন্স দিয়ে যাই , আমি পাস করার সময় যদি আমি মূল্য দিয়ে পাস করি (এবং তারপরে এটি সরানো হয়ে যায়)। আমি বুঝতে পারি যে এটি মান দ্বারা পাস করা এবং ব্যবহার না করার চেয়ে ভাল std::move(কারণ এটি দুইবার অনুলিপি হয়ে যায়)।
সুতরাং দুটি প্রশ্ন:
- আমি কি এখানে সঠিকভাবে বুঝতে পারি?
std::moveরেফারেন্স এবং কেবল কল দিয়ে ওভার ব্যবহার করার কোনও উল্টোপাল্টা আছেm_name{name}?
std::string_viewএবং এসএসওকেও কভার করে।
clang-tidyপঠনযোগ্যতা ব্যয় করে অপ্রয়োজনীয় মাইক্রোপটিমাইজেশনগুলি সম্পর্কে নিজেকে আচ্ছন্ন করার একটি দুর্দান্ত উপায় খুঁজে পেয়েছি । এখানে অন্য যে কোনও কিছুর আগে জিজ্ঞাসা করার প্রশ্নটি হ'ল আমরা আসলে কতবার Creatureকনস্ট্রাক্টরকে কল করি ।
Creature c("John");একটি অতিরিক্ত অনুলিপি তৈরি করে