cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

std::allocate_unique #294

Open apolukhin opened 3 years ago

apolukhin commented 3 years ago

Перенос предложения: голоса +13, -0 Автор идеи: Андрей Марцинкевич

В общем мы имеем std::make_unique, но почему то не имеем std::allocate_unique для работы с кастомными аллокаторами. Ибо инициализировать сейчас unique_ptr для кастомного аллокатора довольно не тривиально (выделить память, вызвать конструктор, написать правильно custom_deleter). Поэтому и предлагаю вынести всю эту работу в std::allocate_unique. Думаю добавить его в STL особо не составит труда.

Пример использования:

CustomAlloc<CustomStruct> alloc;
auto up = std::allocate_unique<int>(alloc, customArg);

//вместо

CustomAlloc<CustomStruct>  alloc;

auto newObj = new (alloc.allocate(1)) TestStruct,

auto dealloc = [alloc = std::move(alloc)](CustomStruct* obj)
{
  obj->~CustomStruct(); 
  alloc.deallocate(obj, 1);
};

auto up = std::unique_ptr<TestStruct, decltype(dealloc)>(newObj, dealloc);
apolukhin commented 3 years ago

Павел, 17 апреля 2018, 19:25 не нужен ли подобный механизм сразу и для shared?

Андрей Марцинкевич, 20 апреля 2018, 19:22 Павел Корозевцев, есть std::allocate_shared

apolukhin commented 3 years ago

Работа над идеей идёт полным ходом, в C++23 должен появиться std::allocate_unique из http://wg21.link/p0211

matwey commented 2 years ago

Работа над идеей идёт полным ходом, в C++23 должен появиться std::allocate_unique из http://wg21.link/p0211

По ссылке какая-то подозрительно простая реализация предлагается. Allocator не обязан уметь присваивание, например, std::pmr::polymorphic_allocator не умеет присваиваться. Т.е. если сложить инстанс такого аллокатора в allocation_deleter<>, то мы получим unique_ptr, который не умеет перемещающее присваивание, swap и т.п. И кому нужен такой unique_ptr?

tomilov commented 2 years ago

не умеет перемещающее присваивание, swap и т.п.

но ведь можно в такой allocation_deleter<> положить аллокатор, предварительно обернув его в unique_ptr<void, void (*)(const void*)>? :)

matwey commented 2 years ago

А кто для вложенного unique_ptr будет память выделять?

Lishen1 commented 1 year ago

реализация https://www.boost.org/doc/libs/1_79_0/libs/smart_ptr/doc/html/smart_ptr.html#allocate_unique рассматривается?