Если нет неопределенного поведения, но есть определенное нарушенное поведение (либо детерминированные нормальные ошибки, либо неопределенные, такие как условия гонки), выгодно отключить оптимизацию, чтобы вы могли просмотреть свой код с помощью отладчика.
Как правило, когда я достигаю такого состояния, мне нравится делать комбинацию из:
- отладочная сборка (без оптимизации) и шагачерез код
- выдавил диагностические операторы в stderr, чтобы я мог легко отследить путь выполнения
Если ошибка более хитрая, я вынимаю valgrind и drd и, при необходимости, добавьте unit-тесты , чтобы изолировать проблему и убедиться, что при обнаружении проблемы решение работает должным образом.
В некоторых крайне редких случаях код отладки работает, но код выпуска не выполняется.Когда это происходит, почти всегда проблема в моем коде;Агрессивная оптимизация в сборках релиза может выявить ошибки, вызванные неправильным пониманием времени жизни временных и т. д. ... ... но даже в такой ситуации наличие отладочной сборки помогает локализовать проблемы.
Короче говоряЕсть несколько очень веских причин, по которым профессиональные разработчики создают и тестируют как отладочные (неоптимизированные), так и выпускаемые (оптимизированные) двоичные файлы.ИМХО, наличие как отладочных, так и релизных сборок, проходящих юнит-тесты в любое время, сэкономит вам много времени на отладку.