อย่างที่คุณบอกว่าตัวเองstd::dynarray
มีไว้สำหรับไดนามิกอาร์เรย์ขนาดคงที่ ไม่สามารถปรับขนาดได้ เป็นการพูดประมาณว่าการปรับปรุงครั้งnew T[N]
แล้วครั้งเล่าstd::unique_ptr<T[]>(new T[N])
และมากกว่า
ไม่จำเป็นต้องปรับขนาดหรือจัดการความจุหมายความว่าคุณสามารถใช้โครงสร้างข้อมูลที่มีความซับซ้อนน้อยลงและใช้พื้นที่น้อยลง
ยิ่งไปกว่านั้น std::dynarray
เป็นสัตว์ประหลาดที่อนุญาตให้นำไปใช้งานในรูปแบบที่แตกต่างและไม่เฉพาะเจาะจงเช่นสามารถวางอาร์เรย์บนสแต็กได้ การเรียกใช้ฟังก์ชันการจัดสรรเป็น "ทางเลือก" คุณสามารถระบุผู้จัดสรรเพื่อสร้างองค์ประกอบของอาร์เรย์ได้ แต่นั่นไม่ใช่ส่วนหนึ่งของชนิด
คุณอาจสงสัยว่าทำไมเราถึงต้องการstd::dynarray
และอาร์เรย์ที่มีความยาวผันแปรได้ VLAs ใน C ++ 14 มีข้อ จำกัด มากกว่ามาก สามารถเป็นตัวแปรเฉพาะที่เป็นตัวแปรอัตโนมัติและไม่มีวิธีระบุนโยบายการจัดสรรและแน่นอนว่าไม่มีอินเทอร์เฟซคอนเทนเนอร์มาตรฐาน
ตัวอย่างบางส่วนจาก 23.3.4.2 ของ "ร่างปัจจุบัน" (ใช้เวลานั้น Google cache):
explicit dynarray(size_type c);
เอฟเฟกต์:จัดสรรพื้นที่จัดเก็บสำหรับc
องค์ประกอบ หรืออาจจะไม่ก่อให้เกิดโลกoperator new
template <class Alloc>
dynarray(size_type c, const Alloc& alloc);
ผลกระทบ:เทียบเท่ากับการก่อสร้างก่อนยกเว้นว่าแต่ละองค์ประกอบถูกสร้างด้วยการก่อสร้างใช้-จัดสรร
คุณสามารถใช้ตัวจัดสรรที่กำหนดเพื่อสร้างองค์ประกอบอาร์เรย์ได้หรือไม่นั้นเป็นลักษณะส่วนกลาง:
แม่แบบ struct uses_allocator, Alloc>: true_type {};
Alloc
ข้อกำหนด:จะเป็นผู้จัดสรร (17.6.3.5) [ หมายเหตุ:ความเชี่ยวชาญของลักษณะนี้จะแจ้งให้ทราบส่วนประกอบของไลบรารีอื่น ๆ ที่dynarray
สามารถสร้างด้วยตัวจัดสรรแม้ว่าจะไม่มีลักษณะจัดสรรที่ซ้อนกันก็ตาม]
แก้ไข:คำตอบของ Jonathan Wakely นั้นน่าเชื่อถือและลึกซึ้งกว่ามาก