» Главная
eXcode.ru » Статьи » С / С++
» Новости
» Опросы
» Файлы
» Журнал



Пользователей: 0
Гостей: 10





Распределители библиотеки STL




    Одна из общих проблем в мобильности - это способность инкапсулировать информацию относительно модели памяти. Эта информация включает типы указателей, тип их разности, тип размера объектов в этой модели памяти, также как её примитивы выделения и освобождения памяти.

    STL принимается за эту проблему, обеспечивая стандартный набор требований для распределителей (allocators), являющихся объектами, которые инкапсулируют эту информацию. Все контейнеры в STL параметризованы в терминах распределителей. Это значительно упрощает задачу взаимодействия с многочисленными моделями памяти.

Требования распределителей (Allocator requirements)

    В следующей таблице мы предполагаем, что X - класс распределителей для объектов типа T, a - значение X, n имеет тип X::size_type, p имеет тип X::pointer, r имеет тип X::reference и s имеет тип X::const_reference.

    Все операции c распределителями, как ожидается, сводятся к постоянному времени.

Таблица 7. Требования распределителей
выражение
возвращаемый тип
утверждение/примечание
состояние до/после
X::value_type Т .
X::reference леводопустимое значение T (lvalue of T) .
X::const_reference const lvalue of T .
X::pointer указатель на тип T результатом operator* для значений X::pointer является reference.
X::const_pointer указатель на тип const T результат operator* для значений X::const_pointer - const_reference;
это - тот же самый тип указателя, как X::pointer, в частности, sizeof(X::const_pointer) == sizeof(X::pointer).
X:: size_type беззнаковый целочисленный тип тип, который может представлять размер самого большого объекта в модели памяти.
X::difference_type знаковый целочисленный тип тип, который может представлять разность между двумя любыми указателями в модели памяти.
X a; . примечание: предполагается деструктор.
a.address(r) указатель *(a.address(r)) == r.
a.const_address(s) const_pointer *(a.address(s)) == s.
a.allocate(n) X::pointer память распределяется для n объектов типа T, но объекты не создаются. allocate может вызывать соответствующее исключение.
a.deallocate(p) результат не используется все объекты в области, указываемой p, должны быть уничтожены до этого запроса.
construct(p, a) void после: *p == a.
destroy(p) void значение, указываемое p, уничтожается.
a.init_page_size() X::size_type возвращённое значение - оптимальное значение для начального размера буфера данного типа. Предполагается, что если k возвращено функцией init_page_size, t - время конструирования для T, и u - время, которое требуется для выполнения allocate(k), тогда k * t будет намного больше, чем u.
a.max_size() X::size_type наибольшее положительное значение X::difference_type

    pointer относится к категории модифицируемых итераторов произвольного доступа, ссылающихся на T. const_pointer относится к категории постоянных итераторов произвольного доступа, ссылающихся на T. Имеется определённое преобразование из pointer в const_pointer.

    Для любого шаблона распределителя Alloc имеется определение для типа void. У Alloc<void> определены только конструктор, деструктор и Alloc<void>::pointer. Преобразования определены из любого Alloc<T>::pointer в Alloc<void>::pointer и обратно, так что для любого p будет p == Alloc<T>::pointer(Alloc<void>::pointer(p)).

Распределитель по умолчанию (The default allocator)

template <class T>
class allocator { 
public:
      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_t difference_type;
      allocator();
      ~allocator();
      pointer address(reference x);
      const_pointer const_address(const_reference x);
      pointer allocate(size_type n);
      void deallocate(pointer p);
      size_type init_page_size();
      size_type max_size();
};

class allocator<void> { 
public:
      typedef void* pointer;
      allocator();
      ~allocator();
};

    Предполагается, что в дополнение к allocator поставщики библиотеки обеспечивают распределители для всех моделей памяти.

К началу статьи





Добавил: LedWormДата публикации: 2006-03-14 10:01:30
Рейтинг статьи:3.00 [Голосов 5]Кол-во просмотров: 9576

Комментарии читателей

Всего комментариев: 0
Ваше имя: *
Текст записи: *
Имя:

Пароль:



Регистрация

Вы купите понравившуюсь программу?
Да, если не найду Crack
19% (40)
С удовольствием если будут деньги
23% (48)
Нет, потомучто не знаю как заплатить
6% (12)
Нет, принципиально!
17% (37)
Нет, у меня никогда нет денег!
14% (29)
Да, если разработчик будет русским
9% (20)
Нет, не хочу париться с оплатой
13% (27)

Проголосовало: 213
Контора. Стол. На столе компьютер. Перед столом - стул. На стуле висит пиджак. Подходят двое.
- А где Вася?
- Да, с утра пошел в Intеrnеt - до сих пор нет.
Рейтинг: 4/10 (2)
Посмотреть все анекдоты