Без оптимизации компилятор создает очень тупой код - каждая команда компилируется очень простым способом, так что она выполняет предназначенную вещь. По умолчанию в сборках Debug оптимизации отключены, поскольку без оптимизаций созданный исполняемый файл напрямую соответствует исходному коду.
Переменные, хранящиеся в регистрах
Как только вы включите оптимизацию, компилятор применяет множество различных методов, чтобы заставить код работать быстрее, в то же время делая то же самое. Наиболее очевидное различие между оптимизированными и неоптимизированными сборками в Visual C ++ заключается в том, что значения переменных хранятся в регистрах как можно дольше в оптимизированных сборках, а без оптимизации они всегда сохраняются в памяти. Это влияет не только на скорость кода, но и на отладку. В результате этой оптимизации отладчик не может надежно получить значение переменной во время пошагового выполнения кода.
Другие оптимизации
Существует несколько других оптимизаций, применяемых компилятором, как описано в / O Опции (Оптимизировать код) MSDN docs . Для общего описания различных методов оптимизации см. Статья по оптимизации компилятора Wikipedia .