Cppreference'den seçim teklifi:
Bu çalışma zamanı polimorfizmi, polymorphic_allocator kullanan nesnelerin, aynı statik ayırıcı türüne rağmen çalışma zamanında farklı ayırıcı türleri kullanmış gibi davranmasına izin verir.
"Normal" ayırıcılarla ilgili sorun, kabın türünü değiştirmeleridir. vector
Belirli bir ayırıcıya sahip olmak istiyorsanız , Allocator
şablon parametresini kullanabilirsiniz:
auto my_vector = std::vector<int,my_allocator>();
Şimdi sorun, bu vektörün farklı bir ayırıcıya sahip bir vektör ile aynı tipte olmamasıdır. Örneğin, varsayılan ayırıcı vektörü gerektiren bir işleve geçemezsiniz veya aynı değişkene / işaretçiye farklı bir ayırıcı tipine sahip iki vektör atayamazsınız, örneğin:
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
Bir polimorfik ayırıcı, ayırıcı davranışını şablon mekanizma yerine dinamik gönderme yoluyla tanımlayabilen bir üyeye sahip tek bir ayırıcı tipidir. Bu, belirli, özelleştirilmiş tahsis kullanan, ancak yine de ortak türde olan konteynerlere sahip olmanızı sağlar.
Ayırıcı davranışının özelleştirilmesi, ayırıcıya bir 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
Geriye kalan ana sorun, gördüğüm kadarıyla, bir std::pmr::
konteynerin hala std::
varsayılan ayırıcı kullanan eşdeğer konteyner ile uyumlu olmamasıdır . Bir kapsayıcıyla çalışan bir arayüz tasarlarken bazı kararlar vermeniz gerekir:
- Aktarılan kapsayıcı özel tahsis gerektirebilir mi?
- eğer öyleyse, bir şablon parametresi eklemeli miyim (rastgele ayırıcılara izin vermek için) veya bir polimorfik ayırıcı kullanımını zorunlu kılmalı mıyım?
Bir şablon çözümü, bir polimorfik ayırıcı da dahil olmak üzere herhangi bir ayırıcıya izin verir , ancak başka dezavantajlara sahiptir (oluşturulan kod boyutu, derleme süresi, kod başlık dosyasında açığa çıkarılmalıdır, problemi dışa doğru itmeye devam eden daha fazla "tip kirliliği" potansiyeli). Öte yandan bir polimorfik ayırıcı çözeltisi, bir polimorfik ayırıcının kullanılması gerektiğini belirtir . Bu, kullanmayı engellerstd::
, varsayılan ayırıcı kapların kullanılmasını engeller ve eski kodla arabirim oluşturmaya yönelik etkileri olabilir.
Normal bir ayırıcı ile karşılaştırıldığında, bir polimorfik ayırıcının, memory_resource işaretçisinin depolama ek yükü (ki bu büyük olasılıkla ihmal edilebilir) ve tahsisler için sanal işlev gönderiminin maliyeti gibi bazı küçük maliyetleri vardır. Esas sorun, muhtemelen, polimorfik ayırıcılar kullanmayan eski kodla uyumsuzluktur.
allocator<T>
Doğal olarak sahip olduğu bazı sorunların üstesinden gelmeye çalışırlar . Dolayısıyla, ayırıcıları sık sık kullanırsanız, bunun değerini göreceksiniz.