Да, здесь происходят три вещи: Когда вы строите в режиме выпуска, компилятор выполняет оптимизированную генерацию кода. Компилятор может изменить порядок, в котором строки исходного кода компилируются в программу (при условии, что это не меняет смысла кода), инструкции между различными строками исходного кода могут смешиваться или переставляться, и, наконец, могут возникнуть проблемы со строкой. таблицу, которую выдает компилятор.
Представьте себе две строки исходного кода, каждая из которых превращается в 8 инструкций на ассемблере. Компилятор может переупорядочить эти 16 инструкций (при условии, что это не изменит их результаты), чтобы обеспечить наиболее эффективную работу ЦП. Но в этой ситуации, какая инструкция должна быть признана компилятором эквивалентной строке 1? и какая инструкция должна быть эквивалентна строке 2 компилятором?
При оптимизированной отладке кода, если вы выполняете отладку на уровне исходного кода, вам приходится жить с реальностью, что «выполняемая в данный момент строка исходного кода» будет сильно колебаться, пока вы выполняете свою программу. Переменные, которые кажутся находящимися в области видимости, будут появляться и исчезать в неочевидное время. Способы компилятора сложны и трудны для понимания. Вам нужно отлаживать код на языке ассемблера перед вами (или исходный код + отображение сборки), чтобы действительно следить за тем, что происходит.
Существуют улучшения, которые компиляторы и отладчики могут внести для улучшения отладки оптимизированного кода на уровне исходного кода, но, вероятно, всегда будет немного сложно следовать им.
person
Jason Molenda
schedule
29.09.2012