วัตถุประสงค์ของข้อเสนอ "อ้างอิงสตริง" และ "อ้างอิงอาร์เรย์" ทุกประเภทคือเพื่อหลีกเลี่ยงการคัดลอกข้อมูลที่มีอยู่แล้วในที่อื่นและต้องใช้มุมมองที่ไม่กลายพันธุ์เท่านั้น string_view
ในคำถามเป็นหนึ่งในข้อเสนอดังกล่าว มีคนก่อนหน้านี้ที่เรียกว่าstring_ref
และarray_ref
เช่นกัน
แนวคิดนี้จะเก็บคู่ของตัวชี้ไปยังองค์ประกอบและขนาดของอาร์เรย์ข้อมูลหรือสตริงที่มีอยู่บางคู่เสมอ
คลาส view-handle ดังกล่าวสามารถส่งผ่านได้อย่างถูกตามค่าและจะเสนอการดำเนินการ substringing ราคาถูก (ซึ่งสามารถนำไปใช้เป็นการเพิ่มตัวชี้ง่ายและการปรับขนาด)
การใช้สตริงจำนวนมากไม่ต้องการการเป็นเจ้าของสตริงอย่างแท้จริงและสตริงที่เป็นปัญหามักจะเป็นของบุคคลอื่นอยู่แล้ว ดังนั้นจึงมีศักยภาพที่แท้จริงสำหรับการเพิ่มประสิทธิภาพโดยการหลีกเลี่ยงสำเนาที่ไม่จำเป็น (ลองนึกถึงการจัดสรรและข้อยกเว้นทั้งหมดที่คุณสามารถบันทึกได้)
สตริง C ดั้งเดิมประสบปัญหาที่ตัวยกเลิก null เป็นส่วนหนึ่งของ API สตริงดังนั้นคุณจึงไม่สามารถสร้างสตริงย่อยได้อย่างง่ายดายโดยไม่ต้องกลายพันธุ์สตริงพื้นฐาน (a strtok
) ใน C ++ สิ่งนี้สามารถแก้ไขได้อย่างง่ายดายโดยการจัดเก็บความยาวแยกจากกันและห่อตัวชี้และขนาดไว้ในคลาสเดียว
อุปสรรคสำคัญและความแตกต่างที่สำคัญอย่างหนึ่งจากปรัชญาห้องสมุดมาตรฐาน C ++ ที่ฉันนึกได้คือคลาส "มุมมองอ้างอิง" นั้นมีความหมายที่แตกต่างกันอย่างสิ้นเชิงจากส่วนที่เหลือของห้องสมุดมาตรฐาน โดยพื้นฐานแล้วทุกอย่างในไลบรารีมาตรฐานนั้นปลอดภัยและไม่มีเงื่อนไข (ถ้ารวบรวมก็ถูกต้อง) ด้วยคลาสอ้างอิงเช่นนี้มันไม่เป็นความจริงอีกต่อไป ความถูกต้องของโปรแกรมของคุณขึ้นอยู่กับรหัสบรรยากาศที่ใช้คลาสเหล่านี้ ดังนั้นมันจึงยากที่จะตรวจสอบและสอน