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

标签 c++11

只是想澄清一下: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/

相关文章:

c++ - 在哪里使用 "std::valarray"是个好主意?

c++ - 多线程服务器在一个线程中处理多个客户端

c++ - 在 C++ 中对 vector 进行排序

c++ - 读取多列并将它们放入 C++ 中的 vector 中

c++ - 在 C++11 中有选择地禁用模板成员的简单方法

c++11 - 如何在基于范围的循环中从向量中删除?

c++ - std::weak_ptr:锁或 shared_ptr 构造函数?

c++ - 取消链接不删除文件

c++ - std::stoul 在带有 NDK r13b 的安卓 Qt 应用程序上出错

c++ - 空花括号 {} 作为范围的结尾