Почему размер std::unique_ptr<SomeClass, decltype(lambdaDeleter)> такой же как и std::unique_ptr<SomeClass>? Хотя размер std::unique_ptr<SomeClass, void (*)(SomeClass*)> в два раза больше.
Re: Почему lambda deleter не меняет размер unique_ptr?
МР>Почему размер std::unique_ptr<SomeClass, decltype(lambdaDeleter)> такой же как и std::unique_ptr<SomeClass>? Хотя размер std::unique_ptr<SomeClass, void (*)(SomeClass*)> в два раза больше.
Лямбда без захвата как класс с оператором () и без членов, для такого можно провернуть empty base optimization (или новый атрибут для включения emtpy member optimization)
Русский военный корабль идёт ко дну!
Re[2]: Почему lambda deleter не меняет размер unique_ptr?
Здравствуйте, Alexander G, Вы писали:
AG>Лямбда без захвата как класс с оператором () и без членов, для такого можно провернуть empty base optimization (или новый атрибут для включения emtpy member optimization)
Здравствуйте, Максим Рогожин, Вы писали:
МР>Здравствуйте, Alexander G, Вы писали:
AG>>Лямбда без захвата как класс с оператором () и без членов, для такого можно провернуть empty base optimization (или новый атрибут для включения emtpy member optimization)
МР>
Так только с [no_unique_address]], который рассматривают для С++20, а пока вот так:
class unique_ptr : private LambdaDeleter {
SomeClass *p;
};
sizeof объекта не может быть 0, и сейчас у каждого члена будет уникальный адрес, но наследование позволяет обеспечить размещение базы LambdaDeleter и члена p по тому же адресу, если они разных типов.
Русский военный корабль идёт ко дну!
Re[4]: Почему lambda deleter не меняет размер unique_ptr?
Здравствуйте, Alexander G, Вы писали:
AG>sizeof объекта не может быть 0, и сейчас у каждого члена будет уникальный адрес, но наследование позволяет обеспечить размещение базы LambdaDeleter и члена p по тому же адресу, если они разных типов.
Спасибо!
Re: Почему lambda deleter не меняет размер unique_ptr?
Здравствуйте, Максим Рогожин, Вы писали:
МР>Почему размер std::unique_ptr<SomeClass, decltype(lambdaDeleter)> такой же как и std::unique_ptr<SomeClass>? Хотя размер std::unique_ptr<SomeClass, void (*)(SomeClass*)> в два раза больше.
В случае с лямбда lambdaDeleter вся информация необходимая для вызова конкретного deleter'а зашита в тип unique_ptr<SomeClass, decltype(lambdaDeleter)>, то есть известна в compile-time, а дальше дело техники а-ля EBO/etc.
В случае же unique_ptr<SomeClass, void (*)(SomeClass*)> — задаётся только тип deleter'а — указатель на функцию — причём какой конкретно указатель на функцию будет использоваться будет известно только в runtime — в зависимости от того какой указатель на deleter будет передан в конструктор вторым аргументом, и вот этот указатель нужно где-то хранить.