
- •8.2.1. Реалізація класів
- •8.2.2. Породження об’єктів
- •8.2.3. Виклик операцій
- •8.2.4. Використання успадкування
- •8.2.5. Реалізація залежностей
- •8.2.6. Шаблони, шаблони-класи
- •Параметри шаблонів, що опускаються
- •Приклади, які використовують вектори символів
- •8.2.8. Основні компоненти stl
- •8.2.8.1. Контейнери
- •Контейнери послідовностей
- •Впорядковані асоціативні контейнери
- •8.2.8.2. Параметричні (родові) алгоритми
- •8.2.8.3. Ітератори
- •8.2.8.4. Об’єкти-функції
- •8.2.8.5. Адаптери
- •8.2.8.6. Алокатори
- •8.2.9. Stl та об’єктно-орієнтоване програмування
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.