আমি ইদানীং কিছু প্রয়োজনীয় অপ্টিমাইজেশন করছি। একটি জিনিস যা আমি করছি তা হ'ল কিছু অস্ট্রিংস স্ট্রিম -> স্প্রিন্টফগুলি পরিবর্তন করা। আমি এসডি স্টাইল অ্যারে, স্টাড স্ট্রিংয়ের একগুচ্ছ স্প্রিন্টফিং করছি la
char foo[500];
sprintf(foo, "%s+%s", str1.c_str(), str2.c_str());
দেখা যাচ্ছে যে মাইক্রোসফ্ট এর std :: স্ট্রিং :: সি_স্ট্রি () বাস্তবায়ন স্থির সময়ে চলে (এটি কেবলমাত্র একটি অভ্যন্তরীণ পয়েন্টার দেয়)। এটি প্রদর্শিত হয় যে libstdc ++ একই কাজ করে । আমি বুঝতে পেরেছি যে std সি_এসটির জন্য কোনও গ্যারান্টি দেয় না, তবে এটি করার আরও একটি উপায় কল্পনা করা শক্ত। উদাহরণস্বরূপ, যদি তারা মেমোরিতে অনুলিপি করেন তবে তাদের বাফারের জন্য মেমরি বরাদ্দ করতে হবে (এটি নষ্ট করার জন্য এটি কলারের হাতে রেখে দেওয়া হবে - এসটিএল চুক্তির অংশ নয়) বা তাদের কোনও অভ্যন্তরীণ স্থিতিতে অনুলিপি করতে হবে বাফার (সম্ভবত থ্রেডসেফ নয়, এবং এর জীবদ্দশায় আপনার কোনও গ্যারান্টি নেই)। সুতরাং কেবলমাত্র অভ্যন্তরীণভাবে রক্ষণাবেক্ষণ করা নাল টার্মিনেটেড স্ট্রিংয়ে কোনও পয়েন্টার ফিরিয়ে দেওয়া একমাত্র বাস্তব সমাধান বলে মনে হয়।
c_str
এটি একটি কনস্ট পদ্ধতি (বা কমপক্ষে একটি কনস্ট ওভারলোড রয়েছে - যা আমি ভুলে যাই) এটি লজিক্যাল মানটিকে পরিবর্তন করে না, তাই এর কারণ হতে পারেmutable
। এটি অন্য কলগুলি থেকে পয়েন্টারগুলিকে ভঙ্গ করবে , ব্যতীত এ জাতীয় পয়েন্টারগুলিকে অবশ্যই একই লজিকাল স্ট্রিংকে উল্লেখ করা উচিত (সুতরাং পুনরায় বলার নতুন কোনও কারণ নেই - ইতিমধ্যে একটি নাল টার্মিনেটর থাকতে হবে) অথবা অন্যথায় অবশ্যই ইতিমধ্যে একটি কলটিতে কল করা উচিত ছিল -কনস্টেড পদ্ধতি ইন-এর মধ্যে।c_str