Я предполагаю, что переменные, о которых вы говорите, являются локальными (а не глобальными).
Если это так, первое, что вы написали:
int i;
...
я ++; // это происходит в функции
неправильно. Я бы не стал доверять этому. Когда-либо.
Если я глобальный, то я мог бы доверять этому, но я бы не стал доверять этому, если бы не знал, как работает компилятор и среда выполнения. Даже тогда инициализация его к 0 должна быть замечена оптимизатором и сделана свободной.
Если вы просто используете простые целочисленные типы, ваш компилятор должен позаботиться об операции этого типа. Единственное отличие, которое вы когда-либо сможете обнаружить, заключается в том, что, возможно, регистры, в которых хранятся некоторые из ваших переменных, могут поменяться местами, и это почти никогда не имеет значения. Это было бы просто побочным эффектом выброса данных в распределитель регистров компилятора в другом порядке, и я даже не знаю, почему я это поднял. О, да, я помню, почему я поднял этот вопрос - потому что, если вам случится взглянуть на сборку и увидеть разницу в сгенерированном коде, вы, возможно, мне не поверите.
При сравнении, если X - переменная, то без оптимизации компилятора вы могли бы лучше справиться со второй.
Меня беспокоит микрооптимизация, и я могу заверить вас, что за исключением тупого компилятора, вы ничего не выиграете.