Страницы

Поиск по вопросам

воскресенье, 12 января 2020 г.

Отладчик пропускает строку

#cpp #visual_cpp


int main()
{
    int i;
    auto foo = []()  -> int {};
    auto bar = [i]() -> int {};
    auto ptr1 = foo; // <-- пропускает
    auto ptr2 = bar;
    return 0;
}


Почему отладчик пропускает 4 строку, а 5 выполняет?
    


Ответы

Ответ 1



Ничего особенно странного. Компилятор имеет право выкидывать «мёртвый» код, то есть, код, который не приводит к видимым пользователем эффектам. Для foo, лямбда без списка захвата есть просто указатель на статическую функцию, поэтому компилятору легче заметить, что строка auto ptr1 = foo; бесполезна (даже в Debug-режиме, да). Для bar это немного сложнее, так что в отладочном режиме компилятор, возможно, не выполняет эту оптимизацию. Таким образом, отладчик не останавливается на этой строчке (auto ptr1 = foo;) по очень простой причине: эта строка не сгенерировала никакого кода. Что именно выбрасывает компилятор при оптимизации, нигде не определено. В Release-режиме компилятор старается выбросить как можно больше, чтобы улучшить программу, но в Debug-режиме более сложный код остаётся для удобства отладки. В случае bar у вас создание (ненужного) объекта, содержащего лямбду, и компилятор решил немного помочь вам и не выбрасывать этот код (хотя и имел полное право). В Release-режиме компилятор VS 2015 замечает, что весь ваш код по существу не нужен, так что реальный ассемблерный код функции main выглядит просто как xor eax, eax ret 0

Ответ 2



Какое у вас IDE? Возможно вы добавили строчку которую пропускает и не скомпилировали, а сразу запустили дебаг. Тк в компилированая версия не содержит эту строчку, он ее пропускает.

Комментариев нет:

Отправить комментарий