Компиляторы 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 такой вид оптимизации?

Я спрашиваю, потому что мне интересно, стоит ли мне делать такие оптимизации вручную, когда я знаю, что определенные предположения удовлетворяются во время лямбда-генерации, или компилятор сделает это для меня.

Ответы на вопрос(2)

Ваш ответ на вопрос