Относительно того, когда использовать какой вариант оптимизации - единого правильного ответа не существует.
Некоторые уровни оптимизации могут иногда снижать производительность. Это зависит от типа кода, который вы пишете, и от шаблона его выполнения, а также от конкретного процессора, на котором вы работаете.
(Чтобы дать простой канонический пример - компилятор может решить использовать оптимизацию, которая делает ваш код немного больше, чем раньше. Это может привести к тому, что определенная часть кода больше не будет помещаться в кэш инструкций, после чего многие потребуется больше обращений к памяти - например, в цикле).
Лучше всего измерять и оптимизировать все, что вам нужно. Попробуйте, измерить и решить.
Одно важное практическое правило - чем больше оптимизаций выполняется в вашем коде, тем сложнее отладить его с помощью отладчика (или прочитать его разборку), поскольку исходное представление C / C ++ удаляется от сгенерированного двоичного кода. По этой причине рекомендуется работать с меньшим количеством оптимизаций при разработке / отладке.