【发布时间】:2019-06-07 11:17:20
【问题描述】:
使用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 的值应该是固定的,并且要使用带有指向 L2 的指针的 L1,x86 中有直接寻址 @987654331 @假设rbx=&L2。为什么 GCC 仍然选择在 lambda 中包含每个引用?
【问题讨论】:
-
你编译时禁用了优化(默认为
-O0),所以想知道为什么 G++ 没有做出更明智的选择有点傻。尽管即使启用了优化,我们仍然得到相同的大小。 godbolt.org/z/a46Nq4 -
@PeterCordes 已编辑以显示优化级别无关紧要,适用于 64 位
-
您可以将此报告为一个错过优化的 GCC 错误 (gcc.gnu.org/bugzilla),看看 gcc 是否可以捕获一系列本地变量,而不是单独存储指向每个本地变量的指针。跨度>
-
也许 ABI 问题也与此相关。
-
@MikeLui:为什么?我很确定 ISO C++ 不会对这样的实现细节有任何话要说。这不是关于语言规则的问题。如果 C++ 标准的相关部分限制了实现选择,则 C++ 标记覆盖。
标签: c++ optimization lambda x86 g++