Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ссылка на объект-аллокатор в конструкторе list. 
:(
    Опции темы
gustavomarginale
Дата 1.7.2010, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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 будет переданный ему аллокатор использовать?
PM MAIL   Вверх
neondartal
Дата 2.7.2010, 02:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
maxim1000
Дата 2.7.2010, 08:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



у аллокаторов есть шаблон rebind, который возвращает тип такого же аллокатора только для объектов другого типа


--------------------
qqq
PM WWW   Вверх
gustavomarginale
Дата 2.7.2010, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 2.7.2008

Репутация: нет
Всего: нет



Цитата(neondartal @ 2.7.2010,  02:08)
Да передается тип данных, потом - происходит вот что, у листа есть еще аллокатор узла 
(пример - 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

Эти функции создают узел и заполняют его данные.

Несколько аллокаторов? А зачем это листу нужно?

Давайте простой пример:

Код

std::list < int > l1;


Объект типа int будет членом структуры _List_node примерно такой:
Код

struct _List_node
{
   _List_node* prev;
   _List_node* next;
   int value;
};


Зачем нам несколько аллокаторов, когда можно пользоваться только таким, который бы выделял память под весь _List_node сразу? Создал узел, заполнил, приаттачил к другим узлам и всё.

Читая bits/stl_list.h (linux gentoo) я, вроде бы, это и вижу. Смысл в работе с несколькими аллокаторами непонятен )
PM MAIL   Вверх
neondartal
Дата 22.7.2010, 03:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 25.11.2009

Репутация: нет
Всего: нет



Цитата(gustavomarginale @  2.7.2010,  08:40 Найти цитируемый пост)
Зачем нам несколько аллокаторов, когда можно пользоваться только таким, который бы выделял память под весь _List_node сразу? Создал узел, заполнил, приаттачил к другим узлам и всё.


Это я выдрал прямо из кода stl::list - ( сколько там используется аллокаторов ) - я не имел ввиду что надо так создавать структуру списка - это код Микрософт-оггеров, а не мой, что увидел - то и написал. И Rebind - тут не причем  - запустите трассировку - сами увидите - сколько аллокаторов там создается при конструировании листа. Разговор ни о чем. smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0610 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.