আপনি যখন কোনও মূল্য ফিরিয়ে দিচ্ছেন তখন মুভ শব্দার্থবিজ্ঞানগুলি অগত্যা এত বড় কোনও উন্নতি নয় - এবং / আপনি যদি কোনও shared_ptr
(বা অনুরূপ কিছু) ব্যবহার করেন তবে আপনি সম্ভবত অকাল হতাশা করছেন। বাস্তবে, প্রায় সমস্ত যুক্তিসঙ্গতভাবে আধুনিক সংকলকরা রিটার্ন মান অপ্টিমাইজেশন (আরভিও) এবং নামযুক্ত রিটার্ন মান অপ্টিমাইজেশন (এনআরভিও) বলে থাকে called এটির মানে যখন আপনি একটি মান ফিরে করছি, পরিবর্তে আসলে মান অনুলিপি যে সব সময়ে, তারা সহজেই কোনও প্রত্যাশিত পয়েন্টার / রেফারেন্সটি পাস করে যেখানে মানটি ফেরতের পরে নির্ধারিত হতে চলেছে এবং ফাংশনটি ব্যবহার করে যেখানে এটি শেষ হতে চলেছে সেখানে মান তৈরি করতে। সি ++ স্ট্যান্ডার্ড এটিকে অনুমতি দেওয়ার জন্য বিশেষ বিধানগুলি অন্তর্ভুক্ত করে, সুতরাং (যদি উদাহরণস্বরূপ) আপনার অনুলিপি নির্মাণকারীরও পার্শ্ব প্রতিক্রিয়া দেখা দেয় তবে মানটি ফেরত দেওয়ার জন্য অনুলিপি নির্মাণকারীর ব্যবহারের প্রয়োজন হয় না। উদাহরণ স্বরূপ:
#include <vector>
#include <numeric>
#include <iostream>
#include <stdlib.h>
#include <algorithm>
#include <iterator>
class X {
std::vector<int> a;
public:
X() {
std::generate_n(std::back_inserter(a), 32767, ::rand);
}
X(X const &x) {
a = x.a;
std::cout << "Copy ctor invoked\n";
}
int sum() { return std::accumulate(a.begin(), a.end(), 0); }
};
X func() {
return X();
}
int main() {
X x = func();
std::cout << "sum = " << x.sum();
return 0;
};
এখানে মূল ধারণাটি মোটামুটি সহজ: পর্যাপ্ত সামগ্রী সহ একটি শ্রেণি তৈরি করুন আমরা এটির অনুলিপি করা এড়াতে চাই, যদি সম্ভব হয় (তবে std::vector
আমরা 32767 এলোমেলো ইনটগুলি পূরণ করি)। আমাদের কাছে একটি স্পষ্ট অনুলিপি কর্টর রয়েছে যা কখন / যদি অনুলিপি হয় তা আমাদের দেখায়। আমাদের কাছে অবজেক্টের এলোমেলো মানগুলির সাথে কিছু করার জন্য আরও কিছু কোড রয়েছে, তাই অপ্টিমাইজার ক্লাস সম্পর্কে সমস্ত কিছুই সরিয়ে দেয় না কারণ এটি কিছুই করে না।
তারপরে আমাদের কাছে কোনও ফাংশন থেকে এই অবজেক্টগুলির মধ্যে একটি ফেরত দেওয়ার জন্য কিছু কোড রয়েছে এবং তারপরে অবজেক্টটি পুরোপুরি উপেক্ষা করা নয়, সত্যই অবজেক্টটি সত্যই তৈরি হয়েছে তা নিশ্চিত করার জন্য যোগফলটি ব্যবহার করুন। কমপক্ষে সাম্প্রতিক / আধুনিক সংকলকগুলির সাথে আমরা এটি চালানোর সময়, আমরা দেখতে পেলাম যে আমরা যে অনুলিপিটি লিখেছি সেগুলি কখনই চালায় না - এবং হ্যাঁ, আমি নিশ্চিত যে এটির সাথে একটি দ্রুত অনুলিপিও অনুলিপি করার shared_ptr
চেয়ে ধীর হয় is মোটেই
সরানো আপনাকে এগুলি ব্যতীত সরাসরি (সরাসরি) না করতে পারার মতো ন্যায্য সংখ্যা করার অনুমতি দেয়। বাহ্যিক মার্জ সাজানোর "মার্জ" অংশটি বিবেচনা করুন - আপনার কাছে বলুন যে আপনি 8 টি ফাইল একত্রে মার্জ করতে যাচ্ছেন। আদর্শভাবে আপনি এই 8 টি ফাইল একটিতে রেখে দিতে চান vector
- তবে যেহেতু vector
(সি ++ 03 অনুযায়ী) উপাদানগুলি অনুলিপি করতে সক্ষম হওয়া দরকার, এবং ifstream
সেগুলি অনুলিপি করা যায় না, আপনি কিছু unique_ptr
/ shared_ptr
, বা সেটিকে কোনও ভেক্টরে রাখার জন্য সেই আদেশের কোনও কিছু। নোট করুন যে এমনকি (উদাহরণস্বরূপ) আমরা reserve
স্পেস রেখেছি vector
তাই আমরা নিশ্চিত যে আমাদের ifstream
এসগুলি কখনই সত্যই অনুলিপি করা হবে না, সংকলক তা জানতে পারে না, সুতরাং কোডটি সংকলন করা হবে না যদিও আমরা জানি যে অনুলিপি নির্মাণকারী কখনও হবে না যাইহোক ব্যবহৃত।
যদিও এটি এখনও অনুলিপি করা যায় না, সি ++ 11 এ স্থানান্তরিত ifstream
হতে পারে। এই ক্ষেত্রে, অবজেক্টগুলি সম্ভবত কখনও স্থানান্তরিত হবে না , তবে সত্য যে তারা প্রয়োজন হতে পারে সংকলককে খুশি রাখে, তাই আমরা কোনও স্মার্ট পয়েন্টার হ্যাক ছাড়াই আমাদের ifstream
অবজেক্টগুলিকে vector
সরাসরি রাখতে পারি।
একটি ভেক্টর যে করে প্রসারিত এমন একটি সময় পদক্ষেপ শব্দার্থবিদ্যা সত্যিই হতে পারে একটি সুন্দর শালীন উদাহরণ / দরকারী যদিও হয়। এই ক্ষেত্রে, আরভিও / এনআরভিও সাহায্য করবে না, কারণ আমরা কোনও ফাংশন (বা খুব অনুরূপ কিছু) থেকে ফেরতের মান নিয়ে কাজ করছি না। আমাদের কাছে একটি ভেক্টর কিছু বস্তু ধারণ করে আছে এবং আমরা এই জিনিসগুলিকে মেমরির একটি নতুন, বৃহত্তর অংশে স্থানান্তরিত করতে চাই।
সি ++ তে, এটি নতুন স্মৃতিতে অবজেক্টগুলির অনুলিপি তৈরি করে, তারপরে পুরানো স্মৃতিতে পুরানো অবজেক্টগুলিকে ধ্বংস করে। পুরানোগুলি কেবল ফেলে দেওয়ার জন্য এই সমস্ত অনুলিপি তৈরি করা অবশ্য সময়ের অপচয় ছিল। সি ++ 11 এ আপনি পরিবর্তে এগুলি সরিয়ে নিয়ে যাওয়ার আশা করতে পারেন। এটি সাধারণত আমাদের সংক্ষেপে, একটি গভীর অনুলিপি (সাধারণত অনেক ধীর) এর পরিবর্তে অগভীর অনুলিপি করতে দেয়। অন্য কথায়, একটি স্ট্রিং বা ভেক্টর সহ (কেবলমাত্র কয়েকটি উদাহরণের জন্য) আমরা পয়েন্টারগুলিকে কেবলমাত্র বস্তুগুলিতে অনুলিপি করি, পরিবর্তে poin পয়েন্টারগুলি উল্লেখ করে সমস্ত ডেটার অনুলিপি তৈরি করে।
shared_ptr
এটি করার জন্য (দ্রুত অনুলিপি করার জন্য godশ্বর একটি সাবধানতা অবলম্বন করুন) এবং যদি পদার্থবিজ্ঞানগুলি প্রায় কোনও কোডিং-, শব্দার্থবিজ্ঞান- এবং পরিষ্কার-পরিচ্ছন্নতা-জরিমানা ছাড়াই এটি অর্জন করতে পারে।