Код: Выделить всё
#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
}
Ответьте на этот вопрос: как 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
Если конструктор базового класса удален, то подкласс также не может создавать объекты. Итак, как unique_ptr применяет EBO к закрытие до C++20?
Подробнее здесь: https://stackoverflow.com/questions/782 ... on-closure
Мобильная версия