Оптимизатору разрешено только вносить изменения в программу, которые не изменяют поведение во время выполнения. Распечатав Option
, , вы изменили поведение во время выполнения и, таким образом, оптимизатор теперь более ограничен.
Добавляя оператор печати, вы делаете адрес переменной видимым и важным для кода:
&[::std::fmt::ArgumentV1::new(&x, ::std::fmt::Debug::fmt)],
// ^^
Это означает, что оптимизатор больше не может пропускать создание области памяти для значения или манипулировать значением, хранящимся в нем. После того, как вы добавили весь ганк о динамической диспетчеризации и вводе-выводе, один дополнительный if
не добавит значительных накладных расходов.
Ваш реальный ответ будет идти читать исходный код LLVM. Оптимизации нетривиальны, они применяются и не применяются по эзотерическим причинам.