gpt4 book ai didi

c++ - 为什么 C++ 中的这个 lambda 包含每个引用?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:46:25 26 4
gpt4 key购买 nike

使用g++.exe -m64 -std=c++17 和任何优化级别编译,然后运行:

#include <iostream>

int main() {
const auto L1 = [&](){};
std::cout << sizeof(L1) << std::endl;
const auto L2 = [&](){L1;};
std::cout << sizeof(L2) << std::endl;
const auto L3 = [&](){L1, L2;};
std::cout << sizeof(L3) << std::endl;
const auto L4 = [&](){L1, L2, L3;};
std::cout << sizeof(L4) << std::endl;
}

输出为1,8,16,24,表示L2包含1个引用,L3包含2个,L4包含3个。

但是,给定相同的函数“[&](){L1, L2;} in main()”,&L1 - &L2 的值 应该是固定的,要将 L1 与指向 L2 的指针一起使用,x86 中有直接寻址 [rbx+const] 假设rbx=&L2。为什么 GCC 仍然选择在 lambda 中包含所有引用?

最佳答案

我认为这是一个遗漏的优化,因此您可以在 https://gcc.gnu.org/bugzilla/ 上将其报告为 gcc 错误.使用 missed-optimization 关键字。

捕获的 lambda 本身不是函数,也不能衰减/转换为函数指针,因此我认为 lambda 对象不需要任何布局。 (Use a lambda as a parameter for a C++ function)。读取 lambda 对象的生成代码将始终从定义它的同一编译单元生成。因此,它只需要一个用于所有局部变量的基指针,并带有偏移量,这听起来似乎是合理的。

如果它们之间的偏移量不是编译时或至少是链接时常量,则其他具有存储类而非自动的变量捕获可能仍需要单独的指针。 (或者这可能是一个单独的优化。)


您实际上可以让编译器使用空间并通过将 lambda 传递给 __attribute__((noinline)) 模板函数在内存中创建一个 lambda 对象。 https://godbolt.org/z/Pt0SCC .

关于c++ - 为什么 C++ 中的这个 lambda 包含每个引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56493306/

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