gpt4 book ai didi

c++ - 带有自定义删除器的 std::unique_ptr 对象的大小(带有引用捕获的 lambda)

转载 作者:太空宇宙 更新时间:2023-11-04 14:52:01 27 4
gpt4 key购买 nike

在下面的代码中,我有一个自定义删除器(使用通过引用捕获的 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;
}

通过引用捕获输出(即使用 ... 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

最佳答案

I understand that state-less functors and lambdas (with no capture) incur no size penalty

确实。

then why does lambdas by-reference capture incur size penalty?

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

关于c++ - 带有自定义删除器的 std::unique_ptr 对象的大小(带有引用捕获的 lambda),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58800036/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com