یکی از مهمترین تصمیمها در طراحی توابع، انتخاب نوع پارامتر برای رشتههای ورودی است. std::string_view زمانی بهترین گزینه است که تابع شما فقط به خواندن رشته نیاز دارد و قرار نیست آن را ذخیره یا تغییر دهد . این نوع داده به شما اجازه میدهد بدون هیچ هزینهای، رشتههایی با انواع مختلف مانند std::string، رشتههای ثابت یا حتی زیررشتهها را به تابع ارسال کنید .
با این حال، اگر پارامتر ورودی شما تقریباً همیشه یک std::string چپمقدار است، استفاده از const std::string& ممکن است کارآمدتر باشد . نکته کلیدی این است که string_view یک شیء ۱۶ بایتی (در سیستمهای ۶۴ بیتی) است و بهترین روش برای عبور از توابع، ارسال بهصورت مقدار (by value) است، نه بهعنوان مرجع .
الگوی دستکاری زیررشتهها بدون تخصیص حافظه
یکی از قدرتمندترین کاربردهای std::string_view، عملیات روی زیررشتهها بدون تخصیص حافظه است. متد substr در string_view برخلاف نسخهی مشابه در std::string، یک رشتهی جدید با کپی دادهها ایجاد نمیکند، بلکه تنها یک نمای جدید از بخشی از رشتهی اصلی برمیگرداند .
همچنین متدهای remove_prefix و remove_suffix به شما امکان میدهند تا نمای خود را از ابتدا یا انتها کوتاه کنید، باز هم بدون هیچ کپی یا تخصیص حافظهای .
این ویژگی در پردازشگرهای متن، تحلیلگرهای دستوری و توابع تجزیهکننده که
نیاز به بررسی بخشهای مختلف یک رشته دارند، بسیار کارآمد است.
هشدارهای حیاتی در مدیریت چرخهی حیات
بزرگترین خطر在使用 std::string_view، مسئولیت مدیریت چرخهی حیات دادههاست. از آنجا که string_view مالک داده نیست، اگر رشتهی اصلی از بین برود، نمای شما به یک اشارهگر آویزان تبدیل میشود . بهعنوان مثال، ساخت یک string_view از یک رشتهی موقت یا ذخیرهسازی آن بهعنوان عضو کلاس، بسیار خطرناک است و باید از آن اجتناب کرد .
نکتهی مهم دیگر این است که std::string_view تضمین نمیکند که به کاراکتر پایانی null ختم شود . برخلاف std::string و رشتههای ثابت، یک string_view ممکن است تنها به بخشی از یک رشته اشاره کند که در انتهای آن کاراکتر null وجود ندارد. بنابراین هرگز نباید از متد data() یک string_view در توابعی استفاده کنید که منتظر یک رشتهی null-terminated مانند توابع خانوادهی strlen یا printf هستند .
بازگرداندن std::string_view از توابع
بازگرداندن std::string_view
از یک تابع فقط در دو حالت امن است: اول، زمانی که به یک رشتهی ثابت
(string literal) اشاره میکند که در تمام طول عمر برنامه معتبر است . دوم، زمانی که نمایی از یک پارامتر ورودی خود تابع را برمیگرداند، زیرا مسئولیت اعتبار دادهها بر عهدهی فراخواننده است . در سایر موارد، بهویژه اگر نمای به یک متغیر محلی تابع اشاره داشته باشد، بازگرداندن آن منجر به رفتار تعریفنشده میشود
کلیدواژه ها : std::string_view-الگوهای string_view-بهینهسازی رشته در C++-مدیریت مدرن رشتهها-string_view parameter-C++17 string_view-مزایای string_view-مقایسه string و string_view-آموزش string_view-string_view substring-remove_prefix-remove_suffix-return string_view-safe string_view-نکات string_view