以下代码:
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表达式构造了如此大的未命名函数对象?
我不明白为什么你似乎感到惊讶.
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)