带有自定义删除程序的std :: unique_ptr对象的大小(带有捕获by-ref的lambda)

nae*_*9on 0 c++ lambda unique-ptr c++14

在下面的代码中,我有一个自定义删除器(使用捕获按引用捕获的lambda)std::unique_ptr。我希望std::unique_ptr对象的大小应与默认删除器的大小相同(即使用运算符删除),因为捕获是通过引用进行的。我知道无状态函子和lambda(不捕获)不会造成大小损失,那么为什么lambda按引用捕获会引起大小损失呢?预先感谢您的解释。

#include <iostream>
#include <memory>

class X{};

int main()
{
    // custom deleter using a state-full lambda
    double data[100]{0};
    auto lmb_sf = [&data](X* ptr){
        // do something
        std::cout<<"In custom deleter using a state-full lambda\n";
        delete ptr;
    };

    std::unique_ptr<X,decltype(lmb_sf)> ptr_sf(new X, lmb_sf);
    std::cout<<"Size of ptr_sf = "<<sizeof(decltype(ptr_sf))<<"\n";

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出按引用捕获(即使用... lmb_sf = [&data] ...)

Size of ptr_sf = 16
In custom deleter using a state-full lambda
Run Code Online (Sandbox Code Playgroud)

输出按值捕获(即使用... lmb_sf = [data] ...)

Size of ptr_sf = 808
In custom deleter using a state-full lambda
Run Code Online (Sandbox Code Playgroud)

eer*_*ika 5

我知道无状态函子和lambda(无捕获)不会造成大小损失

确实。

那为什么lambda引用捕获会导致大小损失呢?

因为捕获lambda是有状态的。该状态必须存储在某个位置。