Аллокатор на стеке

У меня есть структура static_vector, это что-то вроде std::array, ее данные хранятся на стеке, а не на куче.

Пускай я создаю

struct Foo {
  // ...
}; // Весит 64 байта (например)

static_vector<Foo, 16> v0 = {...};
// ...
static_vector<Foo, 16> v1 = std::move(v0);

Мой конструктор перемещения сейчас выглядит вот так:

static_vector(static_vector&& rv_other) noexcept {
  ranges::move(rv_other._arr, rv_other._arr + rv_other._size, _arr);
  _size = rv_other._size;

  rv_other.clear();
}

Можно ли написать конструктор/оператор перемещения так, чтобы данные можно было переместить, как в std::vector (там меняется пара указателей и все) или как-нибудь еще, главное чтобы перемещение было более быстрым.

Может можно сделать аллокатор на стеке? Такое вообще возможно?


Ответы (1 шт):

Автор решения: HolyBlackCat

Тут все ответы очевидные.

Нет, быстрый (за O(1)) конструктор перемещения сделать нельзя, если элементы хрянятся внутри static_vector, а не где-то снаружи.

Да, можно сделать аллокатор, использующий память на стеке. Но он должен хранить указатель на память, а не непосредственно массив символов, потому что аллокатор обязан быть копируемым и перемещаемым, и это не должно менять адреса элементов.

Массив на стеке придется выделать руками, и передавать указатель на него тем контейнерам/аллокаторам/..., которые должны его использовать.

→ Ссылка