title: Разбираемся в АЛЛОКАТОРАХ
media_link: https://www.youtube.com/watch?v=DuHoT6bmb10
author:
- Полевой Дмитрий
created: 2025-04-29
tags:
- y2025
- cpp
- учеба
- конспекты
master: "[[C++ Hub|С++]]"
icon: LiMemoryStick
Разбираемся в АЛЛОКАТОРАХ
Аллокаторы бывают двух типов:
malloc
, jemalloc
, tcmalloc
, ...std::allocator
std::vector<T>
= std::vector<T, std::allocator<T>>
Аллокатор выступает как прослойка для работы с элементами; Также у любого stl
контейнера есть конструктор, который принимает объект аллокатора — 23:51
Должны быть обязательно реализованы методы:
allocate
— возвращает указатель на T
и принимает количество элементов (не смотря на то, что они в size_t
, под которые нужно выделить памятьdeallocate
— принимает указатель T*
и количество элементов, память из-под которых необходимо освободитьusing value_type = T;
20:20 Если аллокатор не содержит полей, то он stateless; иначе statefull
Когда мы создаем std::list<int>
, то передавая аллокатор для int
, он все равно используется для создания node
. Этот механизм называется allocator_traits 15:58
Работает он с помощью метафункции
rebind
, что позволяет из аллокатора одного типа создавать аллокатор другого
При копировании контейнеров у аллокаторов по умолчанию вызывается метод
select_on_container_cope_construction
. По умолчанию он копирует аллокатор 26:44
При присваивании контейнеров аллокатор не копируется, а остается прежний. Для разрешения используются
propagate
'ы 28:47
Некруто, когда мы не можем присваивать контейнеры с разными аллокаторами, правда? Попробуем решить это при помощи полиморфизма!