C++11:lambda malloc 每次声明时都会占用空间吗

me-sa 阅读:24 2024-09-07 23:24:14 评论:0

只是想澄清一下:lambda malloc 每次都会占用空间并在 block 结束时自行释放吗? 例如

void func() { 
    auto lambda = [] (args) { expressions; } 
    static auto s_lambda = [] (args) { expressions; } 
} 

每次我调用 func() 时,lambda() 会被分配到 ram,而 s_lamda() 不会?

在这种情况下,如果函数体非常大,lambda() 的性能会比 s_lambda() 稍差吗?

请您参考如下方法:

lambda 对象会占用内存,但不是您想象的那样。

auto lambda = [] (args) { expressions; } 

被编译器翻译成类似的东西(非常简化)

struct __lambda { 
    auto operator()(args) { expressions; } 
}; 
 
__lambda lambda; 

由于 C++ 的工作方式,每个对象都有严格的正大小,sizeof(lambda) 至少为 1。根据您的 lambda 捕获的内容,这些捕获也可能作为字段存储在编译器生成的类中,在这种情况下,lambda 将占用更多内存来保存这些捕获。

但其内部 operator() 函数的实际主体是经过编译的,而不是在运行时一次又一次地创建的。如果您的 lambda 实际上不使用任何捕获的数据,则至少一个字节的存储可能会被优化掉。


标签:C++
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号