ใบเสนอราคาจาก cppreference:
ความหลากหลายของรันไทม์นี้อนุญาตให้อ็อบเจ็กต์ที่ใช้ polymorphic_allocator ทำงานราวกับว่าพวกมันใช้ชนิดตัวจัดสรรที่แตกต่างกันในขณะทำงานแม้ว่าจะมีประเภทตัวจัดสรรแบบคงที่เหมือนกันก็ตาม
ปัญหาเกี่ยวกับตัวจัดสรร "ปกติ" คือพวกเขาเปลี่ยนประเภทของคอนเทนเนอร์ หากคุณต้องการvector
ด้วยตัวจัดสรรเฉพาะคุณสามารถใช้Allocator
พารามิเตอร์เทมเพลต:
auto my_vector = std::vector<int,my_allocator>();
ปัญหาตอนนี้คือเวกเตอร์นี้ไม่ใช่ประเภทเดียวกับเวกเตอร์ที่มีตัวจัดสรรที่แตกต่างกัน คุณไม่สามารถส่งต่อไปยังฟังก์ชันที่ต้องใช้เวกเตอร์ตัวจัดสรรเริ่มต้นหรือกำหนดเวกเตอร์สองตัวที่มีประเภทตัวจัดสรรที่แตกต่างกันให้กับตัวแปร / ตัวชี้เดียวกันเช่น:
auto my_vector = std::vector<int,my_allocator>();
auto my_vector2 = std::vector<int,other_allocator>();
auto vec = my_vector; // ok
vec = my_vector2; // error
ตัวจัดสรรความหลากหลายเป็นชนิดตัวจัดสรรเดียวที่มีสมาชิกที่สามารถกำหนดลักษณะการทำงานของตัวจัดสรรผ่านการจัดส่งแบบไดนามิกแทนที่จะใช้กลไกเทมเพลต สิ่งนี้ช่วยให้คุณมีคอนเทนเนอร์ที่ใช้การจัดสรรเฉพาะที่กำหนดเอง แต่ยังคงเป็นประเภททั่วไป
การปรับแต่งพฤติกรรมผู้จัดสรรทำได้โดยให้ผู้จัดสรร a std::memory_resource *
:
// define allocation behaviour via a custom "memory_resource"
class my_memory_resource : public std::pmr::memory_resource { ... };
my_memory_resource mem_res;
auto my_vector = std::pmr::vector<int>(0, &mem_res);
// define a second memory resource
class other_memory_resource : public std::pmr::memory_resource { ... };
other_memory_resource mem_res_other;
auto my_other_vector = std::pmr::vector<int>(0, &mes_res_other);
auto vec = my_vector; // type is std::pmr::vector<int>
vec = my_other_vector; // this is ok -
// my_vector and my_other_vector have same type
ปัญหาหลักที่เหลือตามที่ฉันเห็นคือstd::pmr::
คอนเทนเนอร์ยังไม่สามารถใช้งานร่วมกับstd::
คอนเทนเนอร์ที่เทียบเท่าโดยใช้ตัวจัดสรรเริ่มต้น คุณต้องตัดสินใจบางอย่างในขณะที่คุณออกแบบอินเทอร์เฟซที่ใช้งานได้กับคอนเทนเนอร์:
- เป็นไปได้หรือไม่ที่คอนเทนเนอร์ที่ส่งผ่านอาจต้องมีการจัดสรรแบบกำหนดเอง
- ถ้าเป็นเช่นนั้นฉันควรเพิ่มพารามิเตอร์เทมเพลต (เพื่ออนุญาตให้มีตัวจัดสรรตามอำเภอใจ) หรือฉันควรกำหนดให้ใช้ตัวจัดสรรโพลีมอร์ฟิก
โซลูชันเทมเพลตช่วยให้ตัวจัดสรรใด ๆรวมถึงตัวจัดสรรแบบหลายรูปแบบ แต่มีข้อบกพร่องอื่น ๆ (ขนาดโค้ดที่สร้างขึ้นเวลาคอมไพล์โค้ดต้องเปิดเผยในไฟล์ส่วนหัวซึ่งอาจทำให้เกิด "การปนเปื้อนประเภท" เพิ่มเติมซึ่งจะผลักปัญหาออกไปด้านนอก) ในทางกลับกันโซลูชันตัวจัดสรรโพลีมอร์ฟิคจะกำหนดว่าต้องใช้ตัวจัดสรรโพลีมอร์ฟิค สิ่งนี้ขัดขวางการใช้std::
คอนเทนเนอร์ที่ใช้ตัวจัดสรรเริ่มต้นและอาจมีผลในการเชื่อมต่อกับรหัสเดิม
เมื่อเปรียบเทียบกับตัวจัดสรรแบบปกติตัวจัดสรรแบบหลายรูปแบบจะมีต้นทุนเล็กน้อยเช่นค่าใช้จ่ายในการจัดเก็บข้อมูลของตัวชี้ memory_resource (ซึ่งเป็นไปได้น้อยมาก) และค่าใช้จ่ายในการจัดส่งฟังก์ชันเสมือนสำหรับการจัดสรร ปัญหาหลักจริงๆแล้วน่าจะขาดความเข้ากันได้กับรหัสเดิมที่ไม่ใช้ตัวจัดสรรแบบหลายรูปแบบ
allocator<T>
โดยเนื้อแท้ ดังนั้นคุณจะเห็นคุณค่าหากคุณใช้ตัวจัดสรรบ่อยๆ