ฉันได้ทำการปรับปรุงบางอย่างที่จำเป็นเมื่อเร็ว ๆ นี้ สิ่งหนึ่งที่ฉันทำคือการเปลี่ยน ostringstreams -> sprintfs ฉันกำลังรีบพวงของ std :: strings ไปที่ array style ac, ala
char foo[500];
sprintf(foo, "%s+%s", str1.c_str(), str2.c_str());
ปรากฎว่าการใช้งาน std :: string :: c_str () ของ Microsoft นั้นทำงานในเวลาคงที่ (มันแค่คืนค่าตัวชี้ภายใน) ปรากฏว่าlibstdc ++ ไม่เหมือนกัน ฉันรู้ว่ามาตรฐานไม่รับประกันสำหรับ c_str แต่มันยากที่จะจินตนาการถึงวิธีการทำเช่นนี้อีก ตัวอย่างเช่นหากพวกเขาคัดลอกไปยังหน่วยความจำพวกเขาอาจต้องจัดสรรหน่วยความจำสำหรับบัฟเฟอร์ (ปล่อยให้มันขึ้นอยู่กับผู้เรียกที่จะทำลายมัน - ไม่ใช่ส่วนหนึ่งของสัญญา STL) หรือพวกเขาจะต้องคัดลอกไปยังคงที่ภายใน บัฟเฟอร์ (อาจไม่ใช่ threadsafe และคุณไม่มีการรับประกันตลอดอายุการใช้งาน) ดังนั้นเพียงแค่คืนค่าพอยน์เตอร์ไปยังสตริงที่สิ้นสุดด้วยค่า null ภายในที่มีการบำรุงรักษาดูเหมือนจะเป็นทางออกเดียวที่แท้จริง
c_str
เป็นวิธี const (หรืออย่างน้อยมีเกิน const - ฉันลืม)mutable
นี้จะไม่เปลี่ยนแปลงค่าตรรกะดังนั้นอาจจะเป็นเหตุผลสำหรับ มันจะทำลายพอยน์เตอร์จากการโทรอื่นไปที่c_str
ยกเว้นพอยน์เตอร์ดังกล่าวจะต้องอ้างถึงสตริงตรรกะเดียวกัน (ดังนั้นจึงไม่มีเหตุผลใหม่ที่จะจัดสรรใหม่ - ต้องมีเทอร์มิเนเตอร์ที่เป็นโมฆะ) มิฉะนั้นจะต้องโทรหา - วิธีการในระหว่าง