Компиляторы C ++ выполняют оптимизацию времени компиляции на лямбда-замыканиях?
Предположим, у нас есть следующий (бессмысленный) код:
const int a = 0;
int c = 0;
for(int b = 0; b < 10000000; b++)
{
if(a) c++;
c += 7;
}
Переменная 'a' равна нулю, поэтому компилятор может вывести во время компиляции, что инструкция 'if (a) c ++;' никогда не будет выполнен и оптимизирует его.
Мой вопрос:То же самое происходит с лямбда-замыканиями?
Проверьте другой кусок кода:
const int a = 0;
function<int()> lambda = [a]()
{
int c = 0;
for(int b = 0; b < 10000000; b++)
{
if(a) c++;
c += 7;
}
return c;
}
Будет ли компилятор знать, что «a» равно 0, и оптимизирует ли он лямбда?
Еще более сложный пример:
function<int()> generate_lambda(const int a)
{
return [a]()
{
int c = 0;
for(int b = 0; b < 10000000; b++)
{
if(a) c++;
c += 7;
}
return c;
};
}
function<int()> a_is_zero = generate_lambda(0);
function<int()> a_is_one = generate_lambda(1);
Будет ли компилятор достаточно умен, чтобы оптимизировать первую лямбду, когда он знает, что «a» равно 0 во время генерации?
Есть ли у gcc или llvm такой вид оптимизации?
Я спрашиваю, потому что мне интересно, стоит ли мне делать такие оптимизации вручную, когда я знаю, что определенные предположения удовлетворяются во время лямбда-генерации, или компилятор сделает это для меня.