#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? Возможно вы добавили строчку которую пропускает и не скомпилировали, а сразу запустили дебаг. Тк в компилированая версия не содержит эту строчку, он ее пропускает.
Комментариев нет:
Отправить комментарий