Aracılığıyla paylaş


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_stringdahil olmak üzere std::functionen 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:

  1. dönüştürülen bir kopya oluşturucu (örn. örn.

  2. operator==

  3. operator!=

  4. allocate

  5. 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 freekullanan 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.

Ayrıca bkz.

C++ Standart Kitaplığı Başvurusu