1. "এটি কি?"
std::move()
প্রযুক্তিগতভাবে একটি ফাংশন থাকাকালীন - আমি বলব এটি আসলে কোনও ফাংশন নয় । এটি সংকলক যেভাবে অভিব্যক্তির মান বিবেচনা করে তার মধ্যে একটি ধরণের রূপান্তরকারী ।
২. "এটি কী করে?"
প্রথম বিষয় লক্ষণীয় যে std::move()
আসলে কিছুই সরানো হয় না । এটি একটি মূল্যকে (যেমন একটি নামযুক্ত ভেরিয়েবল) হওয়া থেকে এক্সভালিউতে রূপান্তরিত করে । একটি xvalue সংকলকটি বলে:
আপনি আমাকে লুণ্ঠন করতে পারেন, আমি যে কোনও কিছু ধরে রেখেছি তা স্থানান্তর করতে এবং অন্য কোথাও এটি ব্যবহার করতে পারেন (যেহেতু যেভাবেই আমি শীঘ্রই ধ্বংস হয়ে যাব) "।
অন্য কথায়, যখন আপনি ব্যবহার std::move(x)
, আপনি cannibalize করতে কম্পাইলার, যার ফলে করছি x
। সুতরাং, যদি x
বলি, মেমরিতে এটির নিজস্ব বাফার - std::move()
সংকলকটি লেখার পরে এর পরিবর্তে অন্য কোনও বস্তুর নিজস্ব থাকতে পারে।
আপনি কোনও মূল্য থেকেও সরে যেতে পারেন (যেমন আপনি অস্থায়ী হয়ে যাচ্ছেন) তবে এটি খুব কমই কার্যকর।
৩. "এটি কখন ব্যবহার করা উচিত?"
এই প্রশ্নটি জিজ্ঞাসা করার অন্য একটি উপায় হ'ল আমি কোন বিদ্যমান অবজেক্টের সংস্থানগুলির জন্য নরমাংসকরণ করব? " ভাল, আপনি যদি অ্যাপ্লিকেশন কোডটি লিখছেন তবে আপনি সম্ভবত সংকলক দ্বারা তৈরি অস্থায়ী বস্তুগুলির সাথে খুব বেশি গোলমাল করবেন না। সুতরাং প্রধানত আপনি এটি কন্সট্রাক্টর, অপারেটর পদ্ধতি, স্ট্যান্ডার্ড-লাইব্রেরি-অ্যালগোরিদম-এর মতো ফাংশন ইত্যাদিতে করতে পারেন যেখানে বস্তুগুলি স্বয়ংক্রিয়ভাবে অনেকগুলি তৈরি এবং ধ্বংস হয়ে যায়। অবশ্যই এটি থাম্বের একটি নিয়ম মাত্র।
একটি সাধারণ ব্যবহার অনুলিপি করার পরিবর্তে একটি বস্তু থেকে অন্য বস্তুর কাছে 'চলন্ত' সংস্থান। @ গুইলিউম এই পৃষ্ঠায় লিঙ্কগুলি রয়েছে যার সরল সংক্ষিপ্ত উদাহরণ রয়েছে: কম অনুলিপি সহ দুটি বস্তু অদলবদল করা।
template <class T>
swap(T& a, T& b) {
T tmp(a); // we now have two copies of a
a = b; // we now have two copies of b (+ discarded a copy of a)
b = tmp; // we now have two copies of tmp (+ discarded a copy of b)
}
সরানো ব্যবহারের সাহায্যে আপনার চারপাশে অনুলিপি করার পরিবর্তে সংস্থানগুলি অদলবদল করতে দেয়:
template <class T>
swap(T& a, T& b) {
T tmp(std::move(a));
a = std::move(b);
b = std::move(tmp);
}
এন, সাইজের এন T
বলার পরে কী হয় তা ভাবুন vector<int>
। প্রথম সংস্করণে আপনি 3 * এন উপাদানগুলি পড়েন এবং লিখেন, দ্বিতীয় সংস্করণে আপনি মূলত ভেক্টর বাফারগুলিতে 3 টি বাটন, এবং 3 বাফার আকারগুলি পড়েন এবং লিখেন। অবশ্যই, ক্লাসটি T
চলন্ত কীভাবে করতে হবে তা জানতে হবে; আপনার ক্লাসে T
কাজ করার জন্য ক্লাসের জন্য একটি মুভ-এসাইনমেন্ট অপারেটর এবং একটি মুভ-কনস্ট্রাক্টর থাকা উচিত ।