首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当C++ lambda表达式具有大量引用捕获时,未命名函数对象的大小就会变大。

当C++ lambda表达式具有大量引用捕获时,未命名函数对象的大小就会变大。
EN

Stack Overflow用户
提问于 2014-04-18 07:32:31
回答 3查看 1.6K关注 0票数 6

以下代码:

代码语言:javascript
运行
复制
int main() {
    int a, b, c, d, e, f, g;
    auto func = [&](){cout << a << b << c << d << e << f << g << endl;};
    cout << sizeof(func) << endl;
    return 0;
}

g++ 4.8.2编译的输出56

由于所有局部变量都存储在同一个堆栈帧中,因此记住一个指针就足以定位所有局部变量的地址。为什么lambda表达式会构造这么大的未命名函数对象?

EN

Stack Overflow用户

回答已采纳

发布于 2014-04-18 08:12:11

我不明白你为什么看起来很惊讶。

C++标准提供了一组需求,每个实现都可以自由选择满足需求的任何策略。

为什么实现要优化lambda对象的大小?

具体而言,您是否意识到这将如何将此lambda生成的代码绑定到为周围函数生成的代码?

很容易说嘿!这是可以优化的!,但它更难实际优化,并确保它在所有边缘的情况下工作。因此,就我个人而言,我更喜欢简单和有效的实现,而不是对其进行优化的拙劣尝试。

..。尤其是当工作是这么容易的时候

代码语言:javascript
运行
复制
struct S { int a, b, c, d, e, f, g; };

int main() {
    S s = {};
    auto func = [&](){
        std::cout << s.a << s.b << s.c << s.d << s.e << s.f << s.g << "\n";
    };
    std::cout << sizeof(func) << "\n";
    return 0;
}

看,妈:只有4个字节!

票数 6
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23149555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档