Как std::unique_ptr может применять EBO при закрытии?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как std::unique_ptr может применять EBO при закрытии?

Сообщение Anonymous »

Код: Выделить всё

#include 

#include 

int main(){
auto x1 = [](int *p){ delete(p); };

auto ptr = std::unique_ptr(new int{1},x1);

printf("%zu\n", sizeof(ptr)); //  8, unexpected
}
тип с лямбда-выражением имеет размер 8
Ответьте на этот вопрос: как std::unique_ptr не имеет дополнительных затрат на размер при использовании лямбда-выражения
И в заключение, EBO (оптимизация пустого базового класса) позволяет избежать увеличения размера объекта за счет наследования пустого базового класса.
Для этой цели давайте перейдем на Github репозиторий для реализации unique_ptr Microsoft STL:
а затем, если мы перейдем к строке 1229:
https://github.com/microsoft/STL /blob/master/stl/inc/memory#L1229
Вы можете увидеть следующий тип помощника:

Код: Выделить всё

_Compressed_pair _Mypair;
Реализация хранит указатель и средство удаления внутри сжатой пары.
В коде класса вы можете заметить, что unique_ptr использует объект _Mypair для ссылки данные и средство удаления. Например в деструкторе:

Код: Выделить всё

~unique_ptr() noexcept {
if (_Mypair._Myval2) {
_Mypair._Get_first()(_Mypair._Myval2); // call deleter
}
}
Давайте посмотрим на код:
На этот раз нам нужно зайти в заголовок xmemory:
https://github.com/microsoft/STL/blob/m ... mory#L1487
У нас есть две специализации шаблонов:
Первый:

Код: Выделить всё

type here// store a pair of values, deriving from empty first
template 
class _Compressed_pair final : private _Ty1 {
public:
_Ty2 _Myval2;

// ... the rest of impl
И второй:

Код: Выделить всё

// store a pair of values, not deriving from first
template 
class _Compressed_pair final {
public:
_Ty1 _Myval1;
_Ty2 _Myval2;

// ... the rest of impl
сжатая пара довольно проста, поскольку она учитывает только тот случай, если первый тип пуст. И я думаю, что std::unique_ptr) использует первый, но до C++20 типы Closure не имеют (начиная с C++14) конструктора по умолчанию. Таким образом, _Compressed_pair в первом выводит базовый класс без конструктора по умолчанию, как он может создать экземпляр _Compressed_pair _Mypair;?
Если конструктор базового класса удален, то подкласс также не может создавать объекты. Итак, как unique_ptr применяет EBO к закрытие до C++20?

Подробнее здесь: https://stackoverflow.com/questions/782 ... on-closure
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»