Kutipan pilihan dari cppreference:
Polimorfisme runtime ini memungkinkan objek yang menggunakan polymorphic_allocator untuk berperilaku seolah-olah mereka menggunakan jenis pengalokasi yang berbeda pada waktu proses meskipun jenis pengalokasi statis identik
Masalah dengan pengalokasi "biasa" adalah bahwa mereka mengubah jenis penampung. Jika Anda menginginkan vector
dengan pengalokasi khusus, Anda dapat menggunakan Allocator
parameter template:
auto my_vector = std::vector<int,my_allocator>();
Masalahnya sekarang adalah bahwa vektor ini tidak memiliki tipe yang sama dengan vektor dengan pengalokasi berbeda. Anda tidak dapat meneruskannya ke fungsi yang membutuhkan vektor pengalokasi default, misalnya, atau menetapkan dua vektor dengan jenis pengalokasi berbeda ke variabel / penunjuk yang sama, misalnya:
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
Pengalokasi polimorfik adalah jenis pengalokasi tunggal dengan anggota yang dapat menentukan perilaku pengalokasi melalui pengiriman dinamis daripada melalui mekanisme templat. Ini memungkinkan Anda memiliki penampung yang menggunakan alokasi khusus dan disesuaikan, tetapi masih berjenis umum.
Kustomisasi perilaku pengalokasi dilakukan dengan memberikan pengalokasi 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
Masalah utama yang tersisa, seperti yang saya lihat, adalah bahwa std::pmr::
wadah masih tidak kompatibel dengan std::
wadah yang setara menggunakan pengalokasi default. Anda perlu membuat beberapa keputusan pada saat Anda mendesain antarmuka yang berfungsi dengan penampung:
- apakah mungkin penampung yang diteruskan mungkin memerlukan alokasi khusus?
- jika demikian, haruskah saya menambahkan parameter template (untuk memungkinkan pengalokasi arbitrer) atau haruskah saya mengamanatkan penggunaan pengalokasi polimorfik?
Solusi template memungkinkan pengalokasi apa pun , termasuk pengalokasi polimorfik, tetapi memiliki kelemahan lain (ukuran kode yang dihasilkan, waktu kompilasi, kode harus diekspos dalam file header, potensi untuk "kontaminasi jenis" lebih lanjut yang terus mendorong masalah ke luar). Solusi pengalokasi polimorfik di sisi lain menentukan bahwa pengalokasi polimorfik harus digunakan. Ini menghalangi penggunaan std::
penampung yang menggunakan pengalokasi default, dan mungkin berimplikasi untuk berinteraksi dengan kode lama.
Dibandingkan dengan pengalokasi biasa, pengalokasi polimorfik memang memiliki beberapa biaya kecil, seperti overhead penyimpanan penunjuk memory_resource (yang kemungkinan besar dapat diabaikan) dan biaya pengiriman fungsi virtual untuk alokasi. Masalah utama, sebenarnya, mungkin kurangnya kompatibilitas dengan kode lama yang tidak menggunakan pengalokasi polimorfik.
allocator<T>
secara inheren dimilikinya. Jadi, Anda akan melihat nilainya jika Anda sering menggunakan pengalokasi.