Я не совсем понимаю суть вопроса.Похоже, вы спрашиваете: «Почему компилятор генерирует неоптимизированный код, когда переключатель оптимизации выключен?»который вроде отвечает сам.
Впрочем, я попробую.Я думаю, что вопрос на самом деле что-то вроде: «какое дизайнерское решение заставляет компилятор выдавать объявление, хранить и загружать локальную # 1, которую можно оптимизировать?»
Ответ заключается в том, что неоптимизированный кодоген разработанбыть ясным, недвусмысленным, простым в отладке и побуждать джиттер генерировать код, который не агрессивно собирает мусор.Одним из способов достижения всех этих целей является генерация локальных для большинства значений, которые помещаются в стек, даже временных значений.Давайте посмотрим на более сложный пример.Предположим, у вас есть:
Foo(Bar(123), 456)
Мы могли бы сгенерировать это как:
push 123
call Bar - this pops the 123 and pushes the result of Bar
push 456
call Foo
Это приятно, эффективно и мало, но не соответствует нашим целям.Это ясно и недвусмысленно, но это не так легко отладить, потому что сборщик мусора может стать агрессивным. Если Foo по какой-то причине на самом деле ничего не делает со своим первым аргументом, тогда GC разрешается вернуть возвращаемое значение Bar перед запуском Foo.
В неоптимизированной сборке мы генерируем что-тобольше похоже на
push 123
call Bar - this pops the 123 and pushes the result of Bar
store the top of the stack in a temporary location - this pops the stack, and we need it back, so
push the value in the temporary location back onto the stack
push 456
call Foo
Теперь у джиттера есть большой намек, который говорит: «эй, джиттер, оставьте это в локальном режиме некоторое время, даже если Foo его не использует »
Общее правило здесь: «делать локальные переменные из всех временных значений в неоптимизированной сборке».И вот, пожалуйста.чтобы оценить выражение «если», нам нужно оценить условие и преобразовать его в bool.(Конечно, условие не обязательно должно быть типа bool; это может быть тип, неявно преобразуемый в bool, или тип, который реализует пару оператор true / оператор false.) Генератору неоптимизированного кода было сказано "настойчиво переворачивать все временные значения".в местных жителей ", и вот что вы получаете.
Полагаю, в этом случае мы могли бы подавить это на временных значениях, которые являются условиями в выражениях "если", но это звучит как создание для меня работы, которая не приносит пользы клиенту .Так как у меня есть стек работы, пока ваша рука, которая делает , имеет ощутимую выгоду для клиента, я не собираюсь менять генератор неоптимизированного кода, который генерирует неоптимизированный код, в точности так, как это должно быть.