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

在以下代码中,我有一个std::unique_ptr的自定义删除器(使用捕获按引用的lambda)。我希望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;
}

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

Size of ptr_sf = 16
In custom deleter using a state-full lambda

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

Size of ptr_sf = 808
In custom deleter using a state-full lambda
longfeimicu 回答:带有自定义删除程序的std :: unique_ptr对象的大小(带有捕获by-ref的lambda)

  

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

确实。

  

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

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

,

捕获引用的lambda必须在内部存储引用。

尽管我认为标准不指定lambda对象的大小,但逻辑上它必须至少包含捕获的对象的地址。

本文链接:https://www.f2er.com/3124793.html

大家都在问