ฉันสงสัยว่าการทำสำเนาการเขียนมีประโยชน์อะไรบ้าง โดยธรรมชาติแล้วฉันไม่ได้คาดหวังกับความคิดเห็นส่วนตัว แต่เป็นสถานการณ์จริงที่สามารถนำไปใช้ได้จริงในทางที่เป็นรูปธรรมและเป็นประโยชน์ และโดยจับต้องได้ฉันหมายถึงบางสิ่งที่มากกว่าการช่วยให้คุณพิมพ์&
อักขระได้
เพื่อชี้แจงคำถามนี้อยู่ในบริบทของประเภทข้อมูลที่การสร้างการมอบหมายหรือคัดลอกสร้างสำเนาตื้นโดยปริยาย แต่การแก้ไขมันจะสร้างสำเนาลึกโดยนัยและใช้การเปลี่ยนแปลงไปแทนวัตถุต้นฉบับ
เหตุผลที่ฉันถามคือฉันดูเหมือนจะไม่พบข้อดีของการมี COW เป็นพฤติกรรมเริ่มต้นโดยปริยาย ฉันใช้ Qt ซึ่งมีการใช้งาน COW สำหรับประเภทข้อมูลจำนวนมากซึ่งเกือบทั้งหมดมีพื้นที่จัดเก็บข้อมูลที่จัดสรรแบบไดนามิก แต่มันมีประโยชน์ต่อผู้ใช้อย่างไรจริงๆ?
ตัวอย่าง:
QString s("some text");
QString s1 = s; // now both s and s1 internally use the same resource
qDebug() << s1; // const operation, nothing changes
s1[o] = z; // s1 "detaches" from s, allocates new storage and modifies first character
// s is still "some text"
เราจะชนะอะไรโดยใช้ COW ในตัวอย่างนี้
ถ้าหากเราตั้งใจที่จะทำคือการใช้การดำเนินงาน const, ซ้ำซ้อนอาจใช้งานได้ดีs1
s
หากเราตั้งใจจะเปลี่ยนค่า COW จะเพียงแค่ทำการคัดลอกทรัพยากรจนกระทั่งการดำเนินการที่ไม่ใช่ครั้งแรกครั้งแรกมีค่าใช้จ่าย (แม้ว่าจะน้อยที่สุด) ในการเพิ่มจำนวนการอ้างอิงสำหรับการแชร์และการแยกโดยนัยจากที่เก็บข้อมูลที่แชร์ ดูเหมือนว่าค่าโสหุ้ยทั้งหมดที่เกี่ยวข้องใน COW นั้นไม่มีจุดหมาย
มันไม่ได้แตกต่างกันมากนักในบริบทของการส่งผ่านพารามิเตอร์ - หากคุณไม่ต้องการแก้ไขค่าให้ส่งเป็นการอ้างอิงแบบ const ถ้าคุณต้องการแก้ไขคุณสามารถทำการคัดลอกแบบลึกโดยนัยหากคุณไม่ต้องการแก้ไข วัตถุต้นฉบับหรือผ่านการอ้างอิงถ้าคุณต้องการแก้ไข อีกครั้ง COW ดูเหมือนว่าไม่มีค่าใช้จ่ายที่ไม่ประสบความสำเร็จและเพิ่มข้อ จำกัด ที่คุณไม่สามารถแก้ไขค่าเดิมได้แม้ว่าคุณต้องการเนื่องจากการเปลี่ยนแปลงใด ๆ จะแยกออกจากวัตถุดั้งเดิม
ดังนั้นขึ้นอยู่กับว่าคุณรู้เกี่ยวกับวัวหรือหลงลืมมันอาจส่งผลให้รหัสด้วยความตั้งใจชัดเจนและค่าใช้จ่ายที่ไม่จำเป็นหรือพฤติกรรมที่ทำให้เกิดความสับสนอย่างสมบูรณ์ซึ่งไม่ตรงกับความคาดหวังและทำให้คุณเกาหัว
สำหรับฉันดูเหมือนว่ามีวิธีแก้ปัญหาที่มีประสิทธิภาพและอ่านได้มากกว่าไม่ว่าคุณจะต้องการหลีกเลี่ยงการทำสำเนาแบบลึกที่ไม่จำเป็นหรือคุณตั้งใจจะทำ ดังนั้นประโยชน์ในทางปฏิบัติจาก COW อยู่ที่ไหน ฉันคิดว่าจะต้องมีประโยชน์เพราะมันใช้ในกรอบที่ได้รับความนิยมและทรงพลัง
นอกจากนี้จากสิ่งที่ฉันได้อ่านตอนนี้ COW ถูกห้ามอย่างชัดเจนในไลบรารีมาตรฐาน C ++ ไม่รู้ว่า con ที่ฉันเห็นในนั้นมีบางอย่างเกี่ยวกับมันหรือไม่ แต่อย่างใดต้องมีเหตุผลสำหรับสิ่งนี้
[]
ผู้ดำเนินการก็ตาม ดังนั้น COW เปิดใช้งานการออกแบบที่ไม่ดี - ซึ่งฟังดูไม่ค่อยมีประโยชน์ :) จุดในย่อหน้าสุดท้ายดูเหมือนจะใช้ได้ แต่ฉันเองไม่ใช่แฟนตัวยงของพฤติกรรมโดยปริยาย - คนมักจะรับมันแล้ว เป็นช่วงเวลาที่ยากลำบากในการหาสาเหตุที่รหัสไม่ทำงานตามที่คาดไว้และสงสัยจนกระทั่งพวกเขาคิดออกเพื่อตรวจสอบสิ่งที่ซ่อนอยู่หลังพฤติกรรมโดยนัย