只想澄清一下:lambda malloc空间每次都会在块结束时自由释放吗? 例如
void func() {
auto lambda = [] (args) { expressions; }
static auto s_lambda = [] (args) { expressions; }
}
每当我调用func()时,lambda()将被malloc-ed为ram,而s_lamda()则不会?
在这种情况下,如果lambda()的性能非常庞大,那么lambda()的性能会比s_lambda()略差吗?
答案 0 :(得分:6)
一个lambda对象会占用内存,但不是你想的那样。
auto lambda = [] (args) { expressions; }
被编译器翻译成(非常简化)
struct __lambda {
auto operator()(args) { expressions; }
};
__lambda lambda;
由于C ++的工作原理,每个对象都有严格的正尺寸,sizeof(lambda)
至少有一个。根据lambda捕获的内容,这些捕获也可以作为字段存储在编译器生成的类中,在这种情况下,lambda将占用更多内存来保存这些捕获。
但是它的内部operator()
函数的实际主体是被编译的东西,它不是在运行时一次又一次地创建的东西。如果你的lambda实际上没有使用任何捕获的数据,那么至少有一个字节的存储可能会被优化掉。