Ayırıcılar
Ayırıcılar, C++ Standart Kitaplığı tarafından kapsayıcılarda depolanan öğelerin ayrılmasını ve serbest bırakılıp ayrılmasını işlemek için kullanılır. Dışındaki std::array
tüm C++ Standart Kitaplık kapsayıcıları, kapsayıcı öğesinin türünü temsil eden Type
türünde allocator<Type>
bir şablon parametresine sahiptir. Örneğin, vector
sınıfı aşağıdaki gibi bildirilir:
template <
class Type,
class Allocator = allocator<Type>
>
class vector
C++ Standart Kitaplığı, ayırıcı için varsayılan bir uygulama sağlar. C++11 ve sonraki sürümlerde, varsayılan ayırıcı daha küçük bir arabirimi kullanıma sunma amacıyla güncelleştirilir; yeni ayırıcı minimal ayırıcı olarak adlandırılır. Özellikle, minimum ayırıcının construct()
üyesi taşıma semantiğini destekler ve bu da performansı büyük ölçüde geliştirebilir. Çoğu durumda, bu varsayılan ayırıcı yeterli olmalıdır. C++11'de ayırıcı türü parametresini alan tüm Standart Kitaplık türleri ve işlevleri, , shared_ptr, allocate_shared()
ve basic_string
dahil olmak üzere std::function
en düşük ayırıcı arabirimini destekler. Varsayılan ayırıcı hakkında daha fazla bilgi için bkz allocator
. Sınıf.
Kendi Ayırıcınızı Yazma (C++11)
Varsayılan ayırıcı, bellek ayırmak ve serbest bırakmak için ve delete
kullanırnew
. Paylaşılan bellek kullanma gibi farklı bir bellek ayırma yöntemi kullanmak istiyorsanız, kendi ayırıcınızı oluşturmanız gerekir. C++11'i hedeflediyseniz ve yeni bir özel ayırıcı yazmanız gerekiyorsa mümkünse en düşük ayırıcıyı kullanın. Eski stil ayırıcıyı zaten uygulamış olsanız bile, sizin için otomatik olarak sağlanacak daha verimli construct()
yöntemden yararlanmak için bunu en düşük ayırıcı olacak şekilde değiştirmeyi göz önünde bulundurun.
Minimal ayırıcı çok daha az ortak gerektirir ve tüm işi yapan ve deallocate
üye işlevlerine odaklanmanızı allocate
sağlar. En az ayırıcı oluştururken, aşağıdaki örnekte gösterilenler dışında hiçbir üye uygulamayın:
dönüştürülen bir kopya oluşturucu (örn. örn.
operator==
operator!=
allocate
deallocate
Sizin için sağlanacak C++11 varsayılan construct()
üyesi mükemmel iletme yapar ve taşıma semantiğini etkinleştirir; çoğu durumda eski sürümden çok daha verimlidir.
Uyarı
Derleme zamanında, C++ Standart Kitaplığı açıkça sağladığınız üyeleri algılamak için sınıfını kullanır allocator_traits
ve mevcut olmayan üyeler için varsayılan bir uygulama sağlar. Ayırıcınız için bir uzmanlık allocator_traits
sağlayarak bu mekanizmaya müdahale etmeyin!
Aşağıdaki örnekte ve free
kullanan malloc
bir ayırıcının en düşük uygulaması gösterilmektedir. Dizi boyutu izin verilen en büyük boyuttan büyük veya sıfırdan küçükse oluşan yeni özel durum türünün std::bad_array_new_length
kullanımına dikkat edin.
#pragma once
#include <stdlib.h> //size_t, malloc, free
#include <new> // bad_alloc, bad_array_new_length
#include <memory>
template <class T>
struct Mallocator
{
typedef T value_type;
Mallocator() noexcept {} //default ctor not required by C++ Standard Library
// A converting copy constructor:
template<class U> Mallocator(const Mallocator<U>&) noexcept {}
template<class U> bool operator==(const Mallocator<U>&) const noexcept
{
return true;
}
template<class U> bool operator!=(const Mallocator<U>&) const noexcept
{
return false;
}
T* allocate(const size_t n) const;
void deallocate(T* const p, size_t) const noexcept;
};
template <class T>
T* Mallocator<T>::allocate(const size_t n) const
{
if (n == 0)
{
return nullptr;
}
if (n > static_cast<size_t>(-1) / sizeof(T))
{
throw std::bad_array_new_length();
}
void* const pv = malloc(n * sizeof(T));
if (!pv) { throw std::bad_alloc(); }
return static_cast<T*>(pv);
}
template<class T>
void Mallocator<T>::deallocate(T * const p, size_t) const noexcept
{
free(p);
}
Kendi Ayırıcınızı Yazma (C++03)
C++03'te, C++ Standart Kitaplığı kapsayıcılarıyla kullanılan tüm ayırıcıların aşağıdaki tür tanımlarını uygulaması gerekir:
const_pointer
const_reference
difference_type
pointer
rebind
reference
size_type
value_type
Ayrıca, C++ Standart Kitaplığı kapsayıcılarıyla kullanılan tüm ayırıcıların aşağıdaki yöntemleri uygulaması gerekir:
Oluşturucu
Kopya oluşturucu
Yok edici
address
allocate
construct
deallocate
destroy
max_size
operator!=
operator==
Bu tür tanımları ve yöntemleri hakkında daha fazla bilgi için bkz allocator
. Sınıf.