อะไรคือเหตุผลที่อยู่เบื้องหลังไม่แน่ชัดเก็บความยาวของอาร์เรย์กับอาร์เรย์ในC
?
วิธีที่ฉันเห็นมันมีเหตุผลมากมายที่ต้องทำเช่นนั้นแต่มีไม่มากนักในการสนับสนุนมาตรฐาน (C89) ตัวอย่างเช่น
- การมีความยาวที่มีอยู่ในบัฟเฟอร์สามารถป้องกันไม่ให้บัฟเฟอร์มีค่าเกินได้
- สไตล์ Java
arr.length
มีทั้งชัดเจนและหลีกเลี่ยงโปรแกรมเมอร์จากการรักษาจำนวนมากint
ในกองหากจัดการกับหลายอาร์เรย์ - พารามิเตอร์ฟังก์ชั่นกลายเป็นจุดศูนย์กลางมากขึ้น
แต่บางทีเหตุผลที่จูงใจที่สุดในความคิดของฉันก็คือโดยปกติแล้วจะไม่มีการบันทึกที่ว่างหากไม่รักษาความยาว ฉันอยากจะบอกว่าการใช้อาร์เรย์ส่วนใหญ่เกี่ยวข้องกับการจัดสรรแบบไดนามิก จริงอาจมีบางกรณีที่ผู้คนใช้อาร์เรย์ที่จัดสรรในสแต็ก แต่นั่นเป็นเพียงการเรียกใช้ฟังก์ชันเดียว * - สแต็กสามารถจัดการ 4 หรือ 8 ไบต์พิเศษได้
เนื่องจากตัวจัดการฮีปต้องติดตามขนาดบล็อกว่างที่ใช้โดยอาร์เรย์ที่จัดสรรแบบไดนามิกอยู่แล้วเหตุใดจึงไม่ทำให้ข้อมูลนั้นสามารถใช้งานได้ (และเพิ่มกฎเพิ่มเติมตรวจสอบ ณ เวลาคอมไพล์ซึ่งไม่สามารถจัดการความยาวได้อย่างชัดเจน ชอบยิงตัวเองด้วยการเดินเท้า)
สิ่งเดียวที่ฉันคิดได้ในอีกด้านหนึ่งคือการติดตามความยาวอาจทำให้คอมไพเลอร์เรียบง่ายขึ้น แต่ไม่ง่ายกว่านั้นมากนัก
* ในทางเทคนิคเราสามารถเขียนฟังก์ชั่นแบบเรียกซ้ำด้วยอาเรย์ที่มีที่จัดเก็บอัตโนมัติและในกรณีนี้ (ที่ซับซ้อนมาก) การจัดเก็บความยาวอาจส่งผลให้การใช้พื้นที่มีประสิทธิภาพมากขึ้น
malloc()
พื้นที่เอ็ดไม่สามารถร้องขอแบบพกพา?" นั่นเป็นสิ่งที่ทำให้ฉันสงสัยหลายครั้ง