std::string_view เร็วขึ้นในบางกรณี
ก่อนอื่นstd::string const&ต้องการข้อมูลที่อยู่ในstd::stringและไม่ใช่อาร์เรย์ C แบบดิบ, char const*ส่งคืนโดย C API, std::vector<char>สร้างโดยเอ็นจิ้น deserialization, ฯลฯ การแปลงรูปแบบหลีกเลี่ยงหลีกเลี่ยงการคัดลอกไบต์และ (ถ้าสตริงยาวกว่า SBO¹สำหรับ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
เหตุผลใหญ่ที่สองคือมันอนุญาตให้ทำงานกับ substrings โดยไม่มีการคัดลอก สมมติว่าคุณกำลังวิเคราะห์สตริง json 2 กิกะไบต์ (!) ² หากคุณแยกวิเคราะห์มันstd::stringแต่ละโหนดแยกวิเคราะห์ดังกล่าวซึ่งพวกเขาเก็บชื่อหรือค่าของโหนดคัดลอกข้อมูลต้นฉบับจากสตริง 2 gb ไปยังโหนดท้องถิ่น
หากคุณแยกวิเคราะห์เป็นstd::string_views โหนดจะอ้างถึงข้อมูลดั้งเดิม สิ่งนี้สามารถบันทึกการจัดสรรได้หลายล้านครั้งและลดความต้องการหน่วยความจำลงครึ่งหนึ่งในระหว่างการแยกวิเคราะห์
การเร่งความเร็วที่คุณจะได้รับนั้นไร้สาระ
นี้เป็นกรณีที่รุนแรง แต่คนอื่น "ได้รับการย่อยและการทำงานกับมัน" กรณียังสามารถสร้าง speedups string_viewที่เหมาะสมกับ
std::string_viewเป็นส่วนสำคัญในการตัดสินใจคือสิ่งที่คุณจะสูญเสียโดยใช้ มันไม่มาก แต่มันเป็นอะไรบางอย่าง
คุณสูญเสียการบอกเลิก null โดยปริยายและนั่นก็เกี่ยวกับมัน ดังนั้นหากสตริงเดียวกันจะถูกส่งผ่านไปยัง 3 ฟังก์ชั่นซึ่งทั้งหมดนี้ต้องการตัวปิดเทอร์มินัล null การแปลงเป็นstd::stringครั้งเดียวอาจฉลาด ดังนั้นหากรหัสของคุณเป็นที่รู้จักกันว่าต้องมีตัวยกเลิกเทอร์มินัลเป็นโมฆะและคุณไม่คาดหวังว่าสตริงที่ป้อนจากบัฟเฟอร์ C-style ที่มาหรืออาจจะใช้std::string const&กัน มิฉะนั้นจะใช้เวลาstd::string_viewมิฉะนั้นจะใช้
หากstd::string_viewมีการตั้งค่าสถานะที่ระบุว่าเป็นโมฆะ (หรือสิ่งที่นักเล่น) มันจะลบแม้เหตุผลสุดท้ายที่จะใช้std::string const&มันจะเอาแม้กระทั่งว่าเหตุผลสุดท้ายที่จะใช้
มีกรณีที่การเป็นstd::stringที่ไม่มีที่เหมาะสมกว่าconst& std::string_viewหากคุณต้องการเป็นเจ้าของสำเนาของสตริงอย่างไม่มีกำหนดหลังจากการโทรการรับค่าจะมีประสิทธิภาพ คุณจะอยู่ในกรณี SBO (และไม่มีการจัดสรรเพียงไม่กี่สำเนาตัวอักษรเพื่อทำซ้ำ) หรือคุณสามารถย้ายบัฟเฟอร์ที่จัดสรรฮีปไปไว้ในstd::stringเครื่อง มีสองเกินพิกัดstd::string&&และstd::string_viewอาจเร็วกว่า แต่มีเพียงเล็กน้อยเท่านั้นและอาจทำให้โค้ดบวมเล็กน้อย (ซึ่งอาจทำให้คุณได้รับความเร็วทั้งหมด)
Optimization การเพิ่มประสิทธิภาพบัฟเฟอร์ขนาดเล็ก
²กรณีการใช้งานจริง
std::string_viewเป็นเพียงสิ่งที่เป็นนามธรรมของคู่ (char * start, char * end) คุณใช้เมื่อทำการ astd::stringจะเป็นสำเนาที่ไม่จำเป็น