gpt4 book ai didi

c++ - 当 C++ lambda 表达式有很多引用捕获时,未命名函数对象的大小变大

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:18:50 25 4
gpt4 key购买 nike

以下代码:

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 表达式构造了这么大的未命名函数对象?

最佳答案

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

C++标准给出了一套要求,每一个实现都可以自由选择满足要求的策略。

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

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

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

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

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;
}

Look Ma: 4 bytes only!

关于c++ - 当 C++ lambda 表达式有很多引用捕获时,未命名函数对象的大小变大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23149555/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com