Как уже говорили другие, ++ я могу быть более эффективным, чем i ++, если я являюсь экземпляром некоторого объекта. Эта разница может иметь или не иметь существенного значения для вас.
Однако, в контексте вашего вопроса о том, может ли компилятор сделать эти оптимизации для вас, в выбранном вами примере это не так. Причина в том, что ++ i и i ++ имеют разные значения, поэтому они реализованы как разные функции. i ++ должен проделать дополнительную работу (чтобы скопировать текущее состояние перед приращением, сделать приращение, а затем вернуть это состояние). Если вам не нужна эта дополнительная работа, то зачем выбирать эту форму, другую, более прямую?
Ответом может быть удобочитаемость, но в C ++ в этом случае писать ++ i стало идиоматическим, так что я не верю, что читаемость приходит в это.
Таким образом, учитывая выбор между написанием кода, который выполняет ненужную дополнительную работу (которая может или не может быть существенной) без какой-либо выгоды сам по себе, я всегда выбирал бы более прямую форму. Это не преждевременная оптимизация.
С другой стороны, обычно недостаточно значить религиозность в отношении любого из них.