Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Тема8.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
252.93 Кб
Скачать

8.2.8.6. Алокатори

Кожний контейнерний клас у STL використовує клас Allocator, в якому інкапсульована інформація про моделі пам’яті, яка використовується у програмі. Різні моделі пам’яті подають різні вимоги до покажчиків, посилань, розмірів цілих значень і т.п. Клас Allocator містить в собі інформацію про покажчики, константні покажчики, посилання, константні посилання, розміри об’єктів, функції розміщення та виділення об’єктів, а також деякі інші функції. Припускається, що час виконання операції над алокаторами сталий.

Зважаючи на те, що інформація про моделі пам’яті інкапсульована у алокаторі, контейнери STL можуть пристосуватися до різних моделей пам’яті за допомогою різних алокаторів.

У STL визначено стандартний алокатор, застосований за замовчуванням, який достатній для переважної більшості програм. Він має такий інтерфейс:

class allocator {

public:

typedef size_t size_type;

typedef ptrdiff difference_type;

template<class T>

class types {

typedef T* pointer;

typedef const T* const_pointer;

typedef T& reference;

typedef const T& const_reference;

typedef T value_type;

};

allocator();

~ allocator();

template<class T>

typename types<T>::pointer

address(types<T>::reference x) const;

template<class T>

typename types<T>:: const_pointer

address(types<T>::const_reference x) const;

template<class T,class U>

typename types<T>::pointer

allocate(size_type n, types<U>::const_pointer hint);

template<class T>

void deallocate(types<T>::pointer p);

size_type max_size()const;

};

class allocator:: types<void> { //specialization

public:

typedef void* pointer;

typedef const void * const_pointer;

typedef void value_type;

};

void* operator new(size_t N, allocator& a);

};

В алокаторі тип даних інкапсульований у вкладеному шаблоні-класі types, який має такі члени, залежні від параметра шаблона T :

typedef T* pointer; — тип покажчика в моделі пам’яті.

typedef const T* const-pointer; — тип константного покажчика в моделі пам’яті.

typedef T& reference; — тип адреси в моделі пам’яті.

typedef const T& const-reference; — тип константної адреси в моделі пам’яті.

typedef T value type; — тип об’єктів у контейнері.

Інші члени алокатора мають такий зміст:

typedef size t size type; — тип, який подає розмір найбільшого об’єкта в моделі пам’яті.

typedef ptrdiff difference type; — тип, який подає різницю між двома покажчиками в моделі пам’яті.

allocator(); — конструктор алокатора.

~ allocator(); — деструктор алокатора.

template<class T>

typename types<T>::pointer

address(types<T>::referense x) const; — визначає покажчик об’єкта х.

template<class T>

typename types<T>:: const_pointer

address(types<T>::const_referense x) const; — визначає константний покажчик об’єкта х.

template<class T,class U>

typename types<T>::pointer

allocate(size type n, types<U>::const pointer hint); — виділяє пам’ять для n об’єктів типу size type , не конструюючи їх; використовує глобальну операцію new; зазначимо, що різні моделі пам’яті потребують різних функцій Allocate, що і є причиною інкапсуляції цієї функції в алокаторі; покажчик hint можна використовувати як засіб локального засилання; у функціях — членах контейнерів як hint використовується this.

template<class T>

void deallocate(types<T>::pointer p); — звільняє пам’ять з покажчиком p, використовуючи глобальну операцію delete, перед цим викликом deallocate усі об’єкти у звільнюваної пам’яті мають бути ліквідовані.

size type max size ()const; — визначає максимальне значення

difference type.