只是想澄清一下: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++11:lambda malloc 每次声明时都会占用空间吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27523761/