Аллокатор на стеке
У меня есть структура 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 шт):
Тут все ответы очевидные.
Нет, быстрый (за O(1)) конструктор перемещения сделать нельзя, если элементы хрянятся внутри static_vector, а не где-то снаружи.
Да, можно сделать аллокатор, использующий память на стеке. Но он должен хранить указатель на память, а не непосредственно массив символов, потому что аллокатор обязан быть копируемым и перемещаемым, и это не должно менять адреса элементов.
Массив на стеке придется выделать руками, и передавать указатель на него тем контейнерам/аллокаторам/..., которые должны его использовать.