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

use*_*691 6 c++ lambda g++4.8

以下代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

输出56用g ++ 4.8.2编译

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

Mat*_* M. 6

我不明白为什么你似乎感到惊讶.

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

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

具体来说,您是否意识到如何将生成的lambda代码绑定到周围函数的生成代码?

很容易说嘿!这可以优化!,但实际优化并确保它适用于所有边缘情况要困难得多.所以,就个人而言,我更喜欢一个简单而有效的实现,而不是一个优化它的拙劣尝试......

...尤其是当解决方法如此简单时:

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;
}
Run Code Online (Sandbox Code Playgroud)

看Ma:只有4个字节!