Нетрудно узнать, что компилятор делает с вашим кодом (я использую DevStudio 2005 здесь). Напишите простую программу со следующим кодом:
int i = 45, j, k;
j = i * 3;
k = i + (i * 2);
Поместите точку останова в среднюю строку и запустите код, используя отладчик. Когда точка останова сработает, щелкните правой кнопкой мыши по исходному файлу и выберите «Перейти к разборке». Теперь у вас будет окно с кодом, выполняемым процессором. В этом случае вы заметите, что последние две строки выдают точно такие же инструкции, а именно: «lea eax, [ebx + ebx * 2]» (в этом конкретном случае не сдвиг и добавление битов). На современном процессоре IA32, вероятно, более эффективно делать прямое MUL, а не сдвиг битов из-за конвейерной природы ЦП, которая влечет за собой штраф при слишком скором использовании измененного значения.
Это демонстрирует, о чем говорит aku, а именно, компиляторы достаточно умны, чтобы выбрать лучшие инструкции для вашего кода.