Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.64/59: Рейтинг темы: голосов - 59, средняя оценка - 4.64
HardMorg
3 / 26 / 9
Регистрация: 29.08.2010
Сообщений: 204
1

Что такое std::allocator<T> ?

15.02.2012, 23:57. Просмотров 11285. Ответов 8
Метки нет (Все метки)

я так понял возвращает адрес чего то?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.02.2012, 23:57
Ответы с готовыми решениями:

Распределитель памяти идентичный std::allocator. Непонятные синтаксис и концепция std::allocator::construct
Компилятор: MSVC 2010 Exress код моего класса распределяющего память под...

(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&
astxx::manager::connection::connection(std::basic_string&lt;char,...

std::allocator
Здравствуйте! Подскажите почему возникает ошибка сегментирования: using...

std::allocator
я не смог найти хорошего описания роботы с аллокатором, так что спрашиваю у...

allocator std::map
Подскажите вопрос, есть тестовое задание: Подскажите где про это почитать...

8
AzaKendler
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
16.02.2012, 00:10 2
HardMorg, это класс занимающийся управлением памяти в stl контейнерах. <T> - Т - тип размер которого послужит размером шага в куске памяти которым управляет аллокатор.
1
HardMorg
3 / 26 / 9
Регистрация: 29.08.2010
Сообщений: 204
16.02.2012, 00:32  [ТС] 3
Это понятно, только можно поподробней?
Как именно он управляет и зачем это нужно?
вот шаблон
template<class T, class AT = allocator<T>>
я так понимаю он тут возвращает адрес?
0
serejkus
48 / 46 / 6
Регистрация: 31.10.2011
Сообщений: 98
16.02.2012, 00:42 4
Лучший ответ Сообщение было отмечено как решение

Решение

Как именно управляет - это надо смотреть в реализации.
Зачем это нужно: рассмотрим два случая: 1) вы редко создаёте объекты, и у них долгое время жизни. Тогда вы вполне можете позволить себе выделять память для каждого объекта отдельно. 2) вы часто создаёте и уничтожаете объекты. Тогда вам может быть невыгодно постоянно обращаться к системе за выделением/освобождением памяти - вы можете выделить сразу большую область памяти, и отводить части этой памяти для свежесозданных объектов. При уничтожении вы просто помечаете адрес памяти как неиспользуемый, и не возвращаете память системе до конца работы приложения. Тут можно поуправлять тем, как расширяется, как уплотняется эта область памяти (например, для увеличения вероятности попадания в кэш процессора).
10
HardMorg
3 / 26 / 9
Регистрация: 29.08.2010
Сообщений: 204
16.02.2012, 00:58  [ТС] 5
Ну принципе что то понятно
0
silent_1991
Эксперт С++
5011 / 3071 / 271
Регистрация: 11.11.2009
Сообщений: 7,045
Завершенные тесты: 1
16.02.2012, 07:37 6
Лучший ответ Сообщение было отмечено как решение

Решение

HardMorg, стандартный аллокатор просто-напросто выделяет память так же, как это делалось бы вручную через new. Штука в том, что вы можете написать собственный аллокатор, который работает иначе (но, разумеется, сохраняет интерфейс стандартного), так, как нужно вам в конкретной задаче. Тогда его можно будет использовать в стандартных контейнерах так же, как и стандартный библиотечный аллокатор.
Ещё одной особенностью аллокатора является то, что он разделяет выделение памяти и инициализацию объекта, а также освобождение памяти и удаление объекта. Т.е. при вызове метода allocate память выделяется, но конструктор не вызывается (вызывается операторная форма new, не вызывающая конструктора, а работающая как malloc). А вот конструктор объекта вызывается только по вызове метода construct при помощи placement new. То же с методами deallocate(освобождает память при помощи операторной формы delete)/destroy(явно вызывает деструктор объекта). Чтобы писать собственный аллокатор, надо знать подобные тонкости.
13
BPCD
0 / 0 / 0
Регистрация: 05.02.2015
Сообщений: 1
08.12.2015, 00:44 7
следует ли из этого что:
размер памяти выделеной под программу не увеличивается при алокации, а растет только на момент конструирования объектов в выделенной памяти?
0
Croessmah
++Ͻ
14777 / 8453 / 1605
Регистрация: 27.09.2012
Сообщений: 20,803
Записей в блоге: 2
Завершенные тесты: 1
08.12.2015, 02:42 8
Цитата Сообщение от BPCD Посмотреть сообщение
следует ли из этого что
Нет.
1
silent_1991
Эксперт С++
5011 / 3071 / 271
Регистрация: 11.11.2009
Сообщений: 7,045
Завершенные тесты: 1
08.12.2015, 05:45 9
BPCD, отвечу более развёрнуто:
Нет, не следует, поскольку память выделяет как раз операторная форма new, а placement new - это, по сути, способ явно вызвать конструктор, интерпретировав при этом некоторую (уже как-либо выделенную) область памяти как объект (хотя это уточнение излишне, потому что так происходит всегда - объект сам по себе всегда представляет собой просто набор байтов, который логически "режется" на куски, интерпретируемые как поля объекта). С другой стороны, количество захваченной программой памяти может увеличиваться при конструировании, ведь конструктор объекта, вызываемый через placement new, сам может запрашивать память из кучи. Но фактический захват памяти происходит при вызове метода allocate аллокатора.
1
08.12.2015, 05:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.12.2015, 05:45

Std::allocator<wchar_t>>' to 'LPCWSTR'
собственно есть list&lt;wstring&gt; куда вставили много адресов типа L&quot;D:\\66\\99&quot;;...

что такое std::out
люди, в общем препод нам попался из разряда &quot;пришел унизился ушел&quot; ты ему...

Что такое std::string()
И скал в гугле- там ничего понимаемого. Начну, что я вообще в символьных не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru