Alokatory¶
Biblioteka standardowa C++ używa specjalnych obiektów - alokatorów (allocators) - do przydzielania i zwalniania pamięci.
Domyślny alokator używa operatorów new
i delete
do rezerwacji pamięci.
Alokatory służą jako baza dla implementacji własnych rozwiązań zarządzania pamięcią.
Biblioteka C++ definiuje domyślny alokator jako:
namespace std {
template <typename T>
class allocator;
}
Kontenery i algorytmy standardowe można parametryzować za pomocą alokatorów. Alokatory dostarczają interfejsu do przydzielenia i zwolnienia pamięci, oraz utworzenia i zniszczenia obiektów.
Wyrażenie | Skutek |
---|---|
a.allocate(num) | alokuje pamięć dla num elementów |
a.construct(p,val) | inicjalizuje element p wartością val |
a.destroy(p) | niszczy element wskazywany przez p |
a.deallocate(p,num) | zwalnia pamięć dla num elementów wskazywaną przez p |
Szkielet implementacji domyślnego alokatora (C++11)
template <typename T>
class MyAlloc
{
public:
// konieczna definicja value_type
typedef T value_type;
// puste konstruktory - brak stanu
MyAlloc () noexcept = default;
template <typename U> MyAlloc (const MyAlloc<U>&) noexcept { }
// alokacja pamięci
T* allocate (std::size_t num)
{
// globalny operator new
return static_cast<T*>(::operator new(num*sizeof(T)));
}
// zwolnienie pamięci
void deallocate (T* p, std::size_t num)
{
// globalny operator delete
::operator delete(p);
}
};
// wszystkie alokatory tego typu są tożsame
template <typename T1, typename T2>
bool operator== (const MyAlloc<T1>&, const MyAlloc<T2>&) noexcept {
return true;
}
template <typename T1, typename T2>
bool operator!= (const MyAlloc<T1>&, const MyAlloc<T2>&) noexcept {
return false;
}
Przykładem alokatora jest zdefiniowany w bibliotece Boost boost::pool_allocator
.