Скомпилируйте с 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;}
в main()
", значение &L1 - &L2
должно быть фиксированным, и для использования L1
с указателем на L2
, есть прямая адресация в x86 [rbx+const]
при условии rbx=&L2
.Почему GCC по-прежнему предпочитает включать каждую ссылку в лямбду?