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_view
s โหนดจะอ้างถึงข้อมูลดั้งเดิม สิ่งนี้สามารถบันทึกการจัดสรรได้หลายล้านครั้งและลดความต้องการหน่วยความจำลงครึ่งหนึ่งในระหว่างการแยกวิเคราะห์
การเร่งความเร็วที่คุณจะได้รับนั้นไร้สาระ
นี้เป็นกรณีที่รุนแรง แต่คนอื่น "ได้รับการย่อยและการทำงานกับมัน" กรณียังสามารถสร้าง 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
จะเป็นสำเนาที่ไม่จำเป็น