std::string_view কয়েক ক্ষেত্রে দ্রুত হয়।
প্রথমত, std::string const&ডেটা a তে থাকা প্রয়োজন std::string, এবং কোনও কাঁচা সি অ্যারে নয়, সিআই char const*এপি দ্বারা ফেরত দেওয়া, std::vector<char>কিছু ডিসরিয়ালাইজেশন ইঞ্জিন দ্বারা উত্পাদিত ইত্যাদি ইত্যাদি এড়ানো বিন্যাস রূপান্তরটি বাইটগুলি অনুলিপি করা এড়ানো যায় এবং (যদি স্ট্রিংটি এর চেয়ে দীর্ঘ হয় তবে নির্দিষ্ট std::stringপ্রয়োগের জন্য এসবিও¹ ) একটি মেমরি বরাদ্দ এড়ানো হয়।
void foo( std::string_view bob ) {
std::cout << bob << "\n";
}
int main(int argc, char const*const* argv) {
foo( "This is a string long enough to avoid the std::string SBO" );
if (argc > 1)
foo( argv[1] );
}
ক্ষেত্রে কোনও বরাদ্দ দেওয়া হয় না string_view, তবে এটি যদি fooএকটি এর std::string const&পরিবর্তে নেওয়া হয় string_view।
দ্বিতীয় সত্যই বড় কারণ হ'ল এটি অনুলিপি ছাড়াই সাবস্ট্রিংয়ের সাথে কাজ করার অনুমতি দেয়। মনে করুন আপনি একটি 2 গিগাবাইট জেসন স্ট্রিং (!) Ars পার্স করছেন ² আপনি যদি এটিতে পার্স করেন তবে এই std::stringজাতীয় প্রতিটি পার্স নোড যেখানে তারা কোনও নোডের নাম বা মান সঞ্চয় করে সেখানে 2 জিবি স্ট্রিং থেকে স্থানীয় নোডে মূল ডেটা অনুলিপি করে।
পরিবর্তে, আপনি যদি এটির জন্য পার্স std::string_viewকরেন, নোডগুলি মূল ডেটাটিকে উল্লেখ করে। এটি পার্সিংয়ের সময় কয়েক মিলিয়ন বরাদ্দ এবং অর্ধেক মেমরির প্রয়োজনীয়তা সংরক্ষণ করতে পারে।
আপনি যে স্পিডআপ পেতে পারেন তা কেবল হাস্যকর।
এটি একটি চরম ঘটনা, তবে অন্যান্য "সাবস্ট্রিং পান এবং এটির সাথে কাজ করুন" কেসগুলি এর সাথে শালীন স্পিডআপও তৈরি করতে পারে string_view।
সিদ্ধান্তের একটি গুরুত্বপূর্ণ অংশ হ'ল আপনি যা ব্যবহার করে হারাবেন std::string_view। এটি খুব বেশি নয়, তবে এটি কিছু।
আপনি নিখুঁত নাল সমাপ্তি হারাবেন, এবং এটি প্রায় এটিই। সুতরাং যদি একই স্ট্রিংটি 3 টি ফাংশনে পাস করা হয় যার মধ্যে সবগুলিই নাল টার্মিনেটরের প্রয়োজন, std::stringএকবারে রূপান্তর করা বুদ্ধিমান হতে পারে। সুতরাং যদি আপনার কোডটি নাল টার্মিনেটরের প্রয়োজন হিসাবে পরিচিত হয় এবং আপনি সি-স্টাইলের টানযুক্ত বাফার বা এর মতো স্ট্রিংগুলি আশা করেন না তবে সম্ভবত এটি গ্রহণ করুন std::string const&। নইলে ক std::string_view।
যদি std::string_viewএকটি পতাকা থাকে যা যদি জানিয়েছিল যে এটি বাতিল হয়ে গেছে (বা কোনও অনুরাগী কিছু) এটি ব্যবহারের শেষ কারণটিও সরিয়ে ফেলবে std::string const&।
সেখানে একটি মামলা যেখানে একটি গ্রহণ std::stringসঙ্গে const&করা হয় অনুকূল একটি ওভার std::string_view। কল করার পরে যদি আপনার অনির্দিষ্টকালের জন্য স্ট্রিংয়ের একটি অনুলিপি গ্রহণের প্রয়োজন হয় তবে বাই-মান নেওয়া কার্যকর efficient আপনি হয় এসবিও কেসে থাকবেন (এবং কোনও বরাদ্দ নেই, এটির সদৃশ করার জন্য কয়েকটি চরিত্রের অনুলিপি) বা আপনি স্থানীয়ভাবে হ্যাপ-বরাদ্দ হওয়া বাফার স্থানান্তরিত করতে সক্ষম হবেন std::string। দুটি ওভারলোড থাকা std::string&&এবং std::string_viewএটি দ্রুত হতে পারে তবে কেবলমাত্র সামান্য এবং এর ফলে পরিমিত কোড ফুটে উঠবে (যা আপনাকে সমস্ত গতির ব্যয় করতে পারে)।
¹ ছোট বাফার অপ্টিমাইজেশন
প্রকৃত ব্যবহারের ক্ষেত্রে।
std::string_viewএটি (চর * শুরু, চর * শেষ) জুটির একটি বিমূর্ততা। আপনি এটি ব্যবহার করার সময়std::stringএকটি অপ্রয়োজনীয় অনুলিপি হবে।