Разбираемся в АЛЛОКАТОРАХ

Аллокаторы бывают двух типов:

  1. Низкоуровневые: malloc, jemalloc, tcmalloc, ...
  2. Аллокаторы в C++: std::allocator
По умолчанию std::vector<T> = std::vector<T, std::allocator<T>>

Аллокатор выступает как прослойка для работы с элементами; Также у любого stl контейнера есть конструктор, который принимает объект аллокатора — 23:51

Создание аллокатора 10:48

Должны быть обязательно реализованы методы:

  • allocate — возвращает указатель на T и принимает количество элементов (не смотря на то, что они в size_t, под которые нужно выделить память
  • deallocate — принимает указатель T* и количество элементов, память из-под которых необходимо освободить
    А так же нужно указать используемый тип: using value_type = T;
    Раньше требовалось реализовать намного больше функций для того, чтобы создать свой аллокатор 17:28

    std::allocator_traits — класс, который реализует все эти функции, если они не были реализованы в самом аллокаторе; сам std::allocator_traits содержит только статические методы 19:00

20:20 Если аллокатор не содержит полей, то он stateless; иначе statefull

2 аллокатора считаются равными, если память, выделенную одним можно безопасно освободить другим. Технически, если это один и тот же аллокатор 14:43

Когда мы создаем std::list<int>, то передавая аллокатор для int, он все равно используется для создания node. Этот механизм называется allocator_traits 15:58

Работает он с помощью метафункции rebind, что позволяет из аллокатора одного типа создавать аллокатор другого

При копировании контейнеров у аллокаторов по умолчанию вызывается метод select_on_container_cope_construction. По умолчанию он копирует аллокатор 26:44

При присваивании контейнеров аллокатор не копируется, а остается прежний. Для разрешения используются propagate28:47

Полиморфные аллокаторы 29:45

Некруто, когда мы не можем присваивать контейнеры с разными аллокаторами, правда? Попробуем решить это при помощи полиморфизма!