![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
gustavomarginale |
|
|||
Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 2.7.2008 Репутация: нет Всего: нет |
Я пытаюсь понять работу конструктора листа, который вызывается со ссылкой на уже существующий аллокатор. Немного почитал bits/std_list.h...
Вкратце, заминка вот в чём. Когда мы создаём объект типа std::list < T, _Alloc >, где _Alloc - любой аллокатор, например даже умолчательный std::allocator < T >, то сам std::list будет создавать внутри себя экземпляр аллокатора НЕ ЭТОГО типа, а типа _Alloc :: rebind < _List_node<T> > :: other. Это понятно - лист собирается хранить объекты типа T в составе структур-узлов списка, поэтому ему не нужен аллокатор, который умеет выделять память под объекты типа T, а нужен аллокатор, умеющий выделять память под целые узлы (включающие и объект типа T и всякие листовые указатели next/prev...). А rebind нужен потому, что пользователь std::list может не знать, как точно выглядит тип узла std::list. Заминка в том, что конструктору, о котором идёт речь, передаётся ссылка на аллокатор, который выделяет память НЕ для узлов списка, а для объектов типа T (которые меньше по размеру). Ну и как std::list будет переданный ему аллокатор использовать? |
|||
|
||||
neondartal |
|
|||
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 25.11.2009 Репутация: нет Всего: нет |
Да передается тип данных, потом - происходит вот что, у листа есть еще аллокатор узла
(пример - std::_Allocator_base<std::_List_nod<nea::MVector3,std::allocator<nea::MVector3> >::_Node> = {...} Который создает узел и во время этого использует уже аллокатор std::allocator<nea::MVector3> - вот и все. Запусти режим трассировки - и глянь - сразу видно будет. У листа несколько аллокаторов - один из них для узла и для типа даных. Лист во всех случаях - что для выделения узла или чего то еще - будет использовать твой аллокатор. list(): _Mybase(), _Myhead(_Buynode()), _Mysize(0) { // construct empty list } конструктор использует эти функции _Nodeptr _Buynode(); _Nodeptr _Buynode(_Nodeptr _Next, _Nodeptr _Prev, const _Ty& _Val); // push_back Эти функции создают узел и заполняют его данные. Это сообщение отредактировал(а) neondartal - 2.7.2010, 02:27 |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
у аллокаторов есть шаблон rebind, который возвращает тип такого же аллокатора только для объектов другого типа
-------------------- qqq |
|||
|
||||
gustavomarginale |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 49 Регистрация: 2.7.2008 Репутация: нет Всего: нет |
Несколько аллокаторов? А зачем это листу нужно? Давайте простой пример:
Объект типа int будет членом структуры _List_node примерно такой:
Зачем нам несколько аллокаторов, когда можно пользоваться только таким, который бы выделял память под весь _List_node сразу? Создал узел, заполнил, приаттачил к другим узлам и всё. Читая bits/stl_list.h (linux gentoo) я, вроде бы, это и вижу. Смысл в работе с несколькими аллокаторами непонятен ) |
||||||
|
|||||||
neondartal |
|
|||
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 25.11.2009 Репутация: нет Всего: нет |
Это я выдрал прямо из кода stl::list - ( сколько там используется аллокаторов ) - я не имел ввиду что надо так создавать структуру списка - это код Микрософт-оггеров, а не мой, что увидел - то и написал. И Rebind - тут не причем - запустите трассировку - сами увидите - сколько аллокаторов там создается при конструировании листа. Разговор ни о чем. ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |