Программирование >>  Операторы преобразования типа 

1 ... 226 227 228 [ 229 ] 230 231 232 ... 239


Выделение памяти sizeElems = numElems = пиш; elems = alloc.allocate(nuni);

Инициализация элементов uninit1ali2ed fni n (elems. num. val);

Таблица 15.2. Вспомогательные функции для инициализации неинициализированной памяти Выражение Описание

uninitialized rill(l:>eg, end, val) Инициализация интервала [l:>eg,end) значением val

unlnitiallzed fill n(beg, num, val) Инициализация num элементов, начиная с beg, значением val

unlnitialized copy(beg, end, mem) Инициализация элементов, начиная с mem, элементами

интервала [beg,end)

Функция reserveO, которая резервирует дополнительную память без изменения количества элементов (см. с. 158), может быть реализована так:

namespace std (

template <class Т. class Allocator>

void vector<T,Allocator>::reserve(size type size)

Функция reserveO никогда не уменьшает объем памяти if (size <= sizeElems) { return;

Выделение новой памяти для size элементов Т* newniefTi = alloc.allocate(size);

Копирование старых элементов в новую память un1п i 11 а11zed copy(elems.е1ems+numE1 ems.newmem);

Уничтожение старых элементов for (s1ze type 10; 1<numElems; ++1) ( alloc.destroy(&elems[1]);

Освобождение старой памяти

a11 ос.dea11 oca te(el ems.s1zeElems);

Элементы находятся в новой памяти SizeElems = size: elems = newmem;



Использование распределителей при программировании библиотек 705

Инициализирующий итератор

Класс raw storage iterator предназначен для перебора неинициализированной памяти и ее инициализации. Итератор raw storagejterator может использовать любые алгоритмы для инициализации памяти значениями, полученными в результате выполнения алгоритма.

Например, следующая команда инициализирует память, на которую ссылается указатель elems, значениями из интервала [x.begin(),x.end());

сору (x.begInO, x.endC), Источник

raw storage 1terator<T*,T>{elems)); Приемник

В первом аргументе шаблона (в данном случае Т*) должен передаваться итератор вывода для типа элементов. Второй аргумент шаблона (в данном случае Т) определяет тип элементов.

Временные буферы

Функции get temporary buffer() и return temporary buffer() работают с неинициализированной памятью, нредназначенной для краткосрочного использования внутри функции. Учтите, что функция get temporary buffer() может вернуть меньше памяти, чем ожидалось, поэтому она возвращает пару из адреса и размера памяти (в элементах). Пример использования этой функции:

void f{) {

Выделение памяти для num эленентов типа МуТуре

pa1r<MyType*,std;:ptrdiff t> р

= get temporary buffer<MyType>(num);

If {p.second == 0) {

Выделить память для элементов вообще не удалось

else If (p.second < num) (

He удалось выделить достаточно памяти для num элементов, Однако и эту память нужно освободить!

Обработка

Освобождение временной выдепенной памяти If (p.first != 0) (

return temporary buffer(р.f1rst):



Функции get temporary buffer() и retum temporary buffer() слишком сложны для написания безопасного с точки зрения исключений кода, поэтому обычно они не встречаются в библиотечных реализациях.

Распределитель по умолчанию

Распределитель по умолчанию объявляется следующим образом:

namespace std {

template <clas5 Т> class allocator ( public:

Определения типов

typedef size t size type;

typedef ptrdiff t d1fference type:

typedef T* pointer;

typedef const T* const pointer;

typedef T& reference;

typedef const T& const reference;

typedef T value type:

Привязка распределителя к типу U template <c1ass U> struct rebind {

typedef allocator<U> other:

Функции возвращают адреса значений pointer address(reference value) const:

const po1nter address(const reference value) const;

Конструкторы и деструктор allocatorO throwO: allocatorCconst allocators) throwO; template <class U>

allocatorCconst allocator<U>&) throwO; -allocatorO throwO;

Функция возвращает максимальное количество элементов. АЛЯ которых может быть выделена память size type max size() const throwO;

Выделение памяти для num злементов типа Т без инициализации pointer allocate(s1ze type num.

allocator<VDld>::const polnter h1nt=0):

Инициализация злементов выделенного блока р значением value void construct{po1nter p. const T& value);



1 ... 226 227 228 [ 229 ] 230 231 232 ... 239

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика