আমি এটি সম্পর্কে চিন্তা করবেন না। যদি আপনি এটি কোনও লুপে করেন তবে স্ট্রিংগুলি সর্বদা পুনঃব্যবস্থাপনা হ্রাস করার জন্য মেমরিটিকে পূর্ব থেকে নিযুক্ত করবে - কেবলমাত্র operator+=
সেই ক্ষেত্রে ব্যবহার করুন । এবং আপনি যদি এটি ম্যানুয়ালি করেন তবে এটির মতো বা আরও দীর্ঘ কিছু
a + " : " + c
তারপরে এটি অস্থায়ীতা তৈরি করছে - এমনকি সংকলক কিছু রিটার্ন মানের অনুলিপিগুলি সরিয়ে দিতে পারে। এটা এ কারণেও যে একটি ধারাবাহিকভাবে নামক operator+
জানে না এটা কিনা রেফারেন্স প্যারামিটার রেফারেন্স একটি নামাঙ্কিত বস্তু বা একটি অস্থায়ী উপ থেকে প্রত্যাগত operator+
আবাহন। আমি প্রথমে প্রোফাইল না দেওয়ার আগে এটির বিষয়ে চিন্তা করব না not তবে এটি দেখানোর জন্য একটি উদাহরণ নেওয়া যাক। বাঁধাই পরিষ্কার করার জন্য আমরা প্রথমে প্রথম বন্ধনীর পরিচয় করি। আমি স্পষ্টতার জন্য ব্যবহৃত ফাংশন ঘোষণার পরে যুক্তিগুলি সরাসরি রেখেছি। তার নীচে আমি ফলাফলটি প্রকাশের পরে কী তা দেখায়:
((a + " : ") + c)
calls string operator+(string const&, char const*)(a, " : ")
=> (tmp1 + c)
এখন, এই সংযোজনটিতে, tmp1
অপারেটরকে প্রথম কল দ্বারা প্রদর্শিত আর্গুমেন্টগুলি দিয়ে ফিরে আসে। আমরা ধরে নিই যে সংকলকটি সত্যই চতুর এবং রিটার্ন মানের অনুলিপিটিকে অনুকূলিত করে। সুতরাং আমরা এক নতুন স্ট্রিং, যাতে এর সংযুক্তকরণের রয়েছে দিয়ে শেষ a
এবং " : "
। এখন, এটি ঘটে:
(tmp1 + c)
calls string operator+(string const&, string const&)(tmp1, c)
=> tmp2 == <end result>
এটি নিম্নলিখিতের সাথে তুলনা করুন:
std::string f = "hello";
(f + c)
calls string operator+(string const&, string const&)(f, c)
=> tmp1 == <end result>
এটি অস্থায়ী এবং নামযুক্ত স্ট্রিংয়ের জন্য একই ফাংশনটি ব্যবহার করছে! তাই কম্পাইলার হয়েছে একটি নতুন স্ট্রিং এবং যে সংযোজন মধ্যে যুক্তি কপি করে শরীর থেকে ফিরে যাওয়ার operator+
। এটি একটি অস্থায়ী স্মৃতি নিতে পারে না এবং এটিতে যুক্ত হতে পারে। এক্সপ্রেশনটি যত বড়, তত বেশি কপির কাজ করতে হবে।
পরের ভিজ্যুয়াল স্টুডিও এবং জিসিসি পরীক্ষামূলক সংযোজন হিসাবে সি ++ 1x এর মুভ সেমেন্টিকস ( অনুলিপি কপির শব্দার্থক ) এবং মূল্যায়ন রেফারেন্সগুলিকে সমর্থন করবে । এটি প্যারামিটারটি একটি অস্থায়ী সম্পর্কে উল্লেখ করে কিনা তা নির্ধারণের অনুমতি দেয়। এটি এই জাতীয় সংযোজনগুলি আশ্চর্যজনকভাবে দ্রুত করবে, কারণ উপরের সমস্তগুলি অনুলিপি ছাড়াই একটি "অ্যাড-পাইপলাইন" এ শেষ হবে।
যদি এটি কোনও বাধা হয়ে দাঁড়ায় তবে আপনি এখনও তা করতে পারেন
std::string(a).append(" : ").append(c) ...
append
কল যুক্তি যোগ *this
এবং তারপর নিজেদের একটি রেফারেন্স ফিরে যান। সুতরাং সেখানে অস্থায়ীদের কোনও অনুলিপি করা হয় না। অথবা বিকল্পভাবে, operator+=
ব্যবহার করা যেতে পারে তবে অগ্রাধিকার ঠিক করার জন্য আপনার কুৎসিত প্রথম বন্ধনী প্রয়োজন।