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

时间:2014-12-17 10:46:20

标签: c++11

只想澄清一下: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()略差吗?

1 个答案:

答案 0 :(得分:6)

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

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

被编译器翻译成(非常简化)

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

__lambda lambda;

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

但是它的内部operator()函数的实际主体是被编译的东西,它不是在运行时一次又一次地创建的东西。如果你的lambda实际上没有使用任何捕获的数据,那么至少有一个字节的存储可能会被优化掉。