Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 57, средняя оценка - 4.67
HardMorg
3 / 26 / 3
Регистрация: 29.08.2010
Сообщений: 204
#1

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

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

я так понял возвращает адрес чего то?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.02.2012, 23:57
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Что такое std::allocator<T> ? (C++):

Распределитель памяти идентичный std::allocator. Непонятные синтаксис и концепция std::allocator::construct - C++
Компилятор: MSVC 2010 Exress код моего класса распределяющего память под спойлером #include &lt;stdlib.h&gt; // my memory allocator...

(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const& - C++
astxx::manager::connection::connection(std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; const&amp;, unsigned short); ...

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

std::allocator - C++
Здравствуйте! Подскажите почему возникает ошибка сегментирования: using std::cout; using std::endl; int main() { ...

allocator std::map - C++
Подскажите вопрос, есть тестовое задание: Подскажите где про это почитать и разъясните по-возможности, что это вообще такое...

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

8
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
16.02.2012, 00:10 #2
HardMorg, это класс занимающийся управлением памяти в stl контейнерах. <T> - Т - тип размер которого послужит размером шага в куске памяти которым управляет аллокатор.
1
HardMorg
3 / 26 / 3
Регистрация: 29.08.2010
Сообщений: 204
16.02.2012, 00:32  [ТС] #3
Это понятно, только можно поподробней?
Как именно он управляет и зачем это нужно?
вот шаблон
template<class T, class AT = allocator<T>>
я так понимаю он тут возвращает адрес?
0
serejkus
47 / 45 / 4
Регистрация: 31.10.2011
Сообщений: 98
16.02.2012, 00:42 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Как именно управляет - это надо смотреть в реализации.
Зачем это нужно: рассмотрим два случая: 1) вы редко создаёте объекты, и у них долгое время жизни. Тогда вы вполне можете позволить себе выделять память для каждого объекта отдельно. 2) вы часто создаёте и уничтожаете объекты. Тогда вам может быть невыгодно постоянно обращаться к системе за выделением/освобождением памяти - вы можете выделить сразу большую область памяти, и отводить части этой памяти для свежесозданных объектов. При уничтожении вы просто помечаете адрес памяти как неиспользуемый, и не возвращаете память системе до конца работы приложения. Тут можно поуправлять тем, как расширяется, как уплотняется эта область памяти (например, для увеличения вероятности попадания в кэш процессора).
9
HardMorg
3 / 26 / 3
Регистрация: 29.08.2010
Сообщений: 204
16.02.2012, 00:58  [ТС] #5
Ну принципе что то понятно
0
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
16.02.2012, 07:37 #6
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
HardMorg, стандартный аллокатор просто-напросто выделяет память так же, как это делалось бы вручную через new. Штука в том, что вы можете написать собственный аллокатор, который работает иначе (но, разумеется, сохраняет интерфейс стандартного), так, как нужно вам в конкретной задаче. Тогда его можно будет использовать в стандартных контейнерах так же, как и стандартный библиотечный аллокатор.
Ещё одной особенностью аллокатора является то, что он разделяет выделение памяти и инициализацию объекта, а также освобождение памяти и удаление объекта. Т.е. при вызове метода allocate память выделяется, но конструктор не вызывается (вызывается операторная форма new, не вызывающая конструктора, а работающая как malloc). А вот конструктор объекта вызывается только по вызове метода construct при помощи placement new. То же с методами deallocate(освобождает память при помощи операторной формы delete)/destroy(явно вызывает деструктор объекта). Чтобы писать собственный аллокатор, надо знать подобные тонкости.
11
BPCD
0 / 0 / 0
Регистрация: 05.02.2015
Сообщений: 1
08.12.2015, 00:44 #7
следует ли из этого что:
размер памяти выделеной под программу не увеличивается при алокации, а растет только на момент конструирования объектов в выделенной памяти?
0
Croessmah
Ушел
Эксперт CЭксперт С++
13557 / 7707 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
08.12.2015, 02:42 #8
Цитата Сообщение от BPCD Посмотреть сообщение
следует ли из этого что
Нет.
1
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 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::out - C++
люди, в общем препод нам попался из разряда &quot;пришел унизился ушел&quot; ты ему слово, он тебе в ответ десять вопросов он задал мне банальый...

Что такое std::string() - C++
И скал в гугле- там ничего понимаемого. Начну, что я вообще в символьных не шарю. Обьясните пожалуста, что это и что оно делает. ...

Как сделать свой контейнер совместимым с std::allocator? - C++
Как сделать свой контейнер совместимым с std::allocator?

Разъясните код пжлст(выдает ошибку:cannot convert from 'class std::list<class c_bullet *,class std::allocator<class c_bullet *> >::iterator' to 'int') - C++
Есть такие строки: std::list&lt;c_bullet*&gt; Bullets; ... for(auto i = Bullets.begin(); i != Bullets.end(); /**/) В строке цикла вот...


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

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

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