LINUX.ORG.RU

std::allocator Просветите.


0

0

Понадобилось мне использовать "своеобразный" контейнерный класс, коего нет в шаблонах stl. Возник вопрос выделения/освобождения памяти и чтоб не городить велосипед решил посмотреть как выделяется/освобождается память в стандартных контейнерах. И о боже! оказывается по умолчанию используется аллокатор std::allocator (наследуется от __glibcxx_base_allocator, что есть ничто иное как __gnu_cxx::new_allocator).

А теперь вопрос непосредственно о __gnu_cxx::new_allocator. Допустим есть такой код: std::vector<int> v; for (size_t i = 0; i < 5; i++) v.push_back (i);

Правильно я понимаю, что при i равном 0 вызывается allocate (sizeof (int)), а затем четыре раза: память выделяется через allocate (sizeof (int) * (i + 1)), информация копируется из старого аллокатора в новый (через метод std::__uninitialized_copy_a), а затем память старого аллокатора освобождается? Если это правда, то почему нельзя сделать связный список с кусками выделенной памяти? Понимаю, что для обращения к n-ому элементу вектора легче обратиться через <указатель на первый элемент вектора> + n, но ведь и в std::list используется __gnu_cxx::new_allocator?!

ps и если можно сбросьте линки на информацию на русском об аллокаторах в пространстве std.

★★

> Правильно я понимаю, что при i равном 0 вызывается allocate (sizeof (int)), а затем четыре раза: память выделяется через allocate (sizeof (int) * (i + 1))

нет. В большинстве реализаций запрашиваемый размер растет в геометрической прогрессии (резерв поддерживается).

dilmah ★★★★★
()

про геометрический рост сказали + еще для вектора должна выполняться обратная совместимость с массивами Си - таково требование стандарта.

Reset ★★★★★
()
Ответ на: комментарий от dilmah

>нет. В большинстве реализаций запрашиваемый размер растет в геометрической прогрессии (резерв поддерживается).

блин, да! написал мелкий пример, vector запрашивает память под количество объектов, кратных степени двойки.

ale ★★
() автор топика
Ответ на: комментарий от ale

Насколько я помню это тоже требование стандарта. Количество запросов памяти должно порядка логарифма.

devinull ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.