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 实际上不使用任何捕获的数据,则至少一个字节的存储可能会被优化掉。
声明
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。