Re: Почему lambda deleter не меняет размер unique_ptr?
От: Evgeny.Panasyuk Россия  
Дата: 06.05.18 07:48
Оценка: 2 (1) +1
Здравствуйте, Максим Рогожин, Вы писали:

МР>Почему размер 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 будет передан в конструктор вторым аргументом, и вот этот указатель нужно где-то хранить.
Re: Почему lambda deleter не меняет размер unique_ptr?
От: Alexander G Украина  
Дата: 05.05.18 17:41
Оценка: 2 (1)
Здравствуйте, Максим Рогожин, Вы писали:


МР>Почему размер std::unique_ptr<SomeClass, decltype(lambdaDeleter)> такой же как и std::unique_ptr<SomeClass>? Хотя размер std::unique_ptr<SomeClass, void (*)(SomeClass*)> в два раза больше.


Лямбда без захвата как класс с оператором () и без членов, для такого можно провернуть empty base optimization (или новый атрибут для включения emtpy member optimization)
Русский военный корабль идёт ко дну!
Re[3]: Почему lambda deleter не меняет размер unique_ptr?
От: Alexander G Украина  
Дата: 05.05.18 18:02
Оценка: 2 (1)
Здравствуйте, Максим Рогожин, Вы писали:

МР>Здравствуйте, Alexander G, Вы писали:


AG>>Лямбда без захвата как класс с оператором () и без членов, для такого можно провернуть empty base optimization (или новый атрибут для включения emtpy member optimization)


МР>
МР>class unique_ptr {
МР>   SomeClass *p;
МР>   LambdaDeleter lambdaDeleter; // sizeof (LambdaDeleter) == 0
МР>};

МР>

МР>Т.е. вот так примерно?

Так только с [no_unique_address]], который рассматривают для С++20, а пока вот так:

class unique_ptr : private LambdaDeleter {
   SomeClass *p;
};


sizeof объекта не может быть 0, и сейчас у каждого члена будет уникальный адрес, но наследование позволяет обеспечить размещение базы LambdaDeleter и члена p по тому же адресу, если они разных типов.
Русский военный корабль идёт ко дну!
Почему lambda deleter не меняет размер unique_ptr?
От: Максим Рогожин Россия  
Дата: 05.05.18 17:32
Оценка:
Привет!

class SomeClass {};

auto lambdaDeleter = [](SomeClass* p) { 
   delete p;
}; 

void funcDeleter(SomeClass* p) {
   delete p;
}

const int SZ = sizeof (std::unique_ptr<SomeClass>);
const int SZ_func = sizeof (std::unique_ptr<SomeClass, void (*)(SomeClass*)>);
const int SZ_lambda = sizeof (std::unique_ptr<SomeClass, decltype(lambdaDeleter)>);

std::cout << SZ << std::endl;
std::cout << SZ_func << std::endl;
std::cout << SZ_lambda << std::endl;


Output:
8
16
8





Почему размер std::unique_ptr<SomeClass, decltype(lambdaDeleter)> такой же как и std::unique_ptr<SomeClass>? Хотя размер std::unique_ptr<SomeClass, void (*)(SomeClass*)> в два раза больше.
Re[2]: Почему lambda deleter не меняет размер unique_ptr?
От: Максим Рогожин Россия  
Дата: 05.05.18 17:56
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>Лямбда без захвата как класс с оператором () и без членов, для такого можно провернуть empty base optimization (или новый атрибут для включения emtpy member optimization)


class unique_ptr {
   SomeClass *p;
   LambdaDeleter lambdaDeleter; // sizeof (LambdaDeleter) == 0
};

Т.е. вот так примерно?
Re[4]: Почему lambda deleter не меняет размер unique_ptr?
От: Максим Рогожин Россия  
Дата: 05.05.18 18:11
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>sizeof объекта не может быть 0, и сейчас у каждого члена будет уникальный адрес, но наследование позволяет обеспечить размещение базы LambdaDeleter и члена p по тому же адресу, если они разных типов.


Спасибо!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.