Вы не делаете это.Если у вас нет мертвого компилятора, он сможет оптимизировать его достаточно адекватно.
Если вы собираетесь выполнять этот уровень микрооптимизации, вам нужно начать смотреть на базовый код сборки, не при условии, что ваш компилятор будет слепо переводить ваш код в точно эквивалентный код сборки.
Вам также нужно будет лучше разбираться в тонкостях вашей целевой платформы, чем люди, которые пишут ваш компилятор, которыйоткровенно говоря, основанный на безумном коде, который я видел от gcc
на высоких уровнях оптимизации, маловероятно: -)
Обычно вы получите больший возврат инвестиций, если сосредоточитесь на оптимизации общего изображениянапример, выбор алгоритма и т. д.
То, что вы должны сделать (если вы еще этого не сделали), это профилировать код, когда он будет завершен, чтобы увидеть узкие места (и только , если он работает хуже: нет смысла оптимизировать что-то, что уже работает достаточно быстро).
Тогда сконцентрируйся на этих узких местах. Мера, не угадай!
В качестве примера, я собирался показать вам, насколько хорошо оптимизирован следующий код:
#include <stdio.h>
int main(void) {
int j, sum, array[50];
for (j = 0; j < 50; j++)
array[j] = 999 - j * 2;
j = 22;
sum = array[j] + array[j+1] + array [j + 2] + array[j + 3];
return 0;
}
но на уровне оптимизации gcc 3 он стал:
main:
pushl %ebp ; prolog
xorl %eax, %eax ; return value
movl %esp, %ebp ; epilog 1
popl %ebp ; epilog 2
ret
Да, все верно, это всего лишь пролог стека и код эпилога и установка возвращаемого значения, без каких-либо вычислений в поле зрения.gcc
(правильно) выяснил, что ни один из расчетов нигде не используется, поэтому полностью их оптимизировал.
Как только вы его используете, соответствующий код становится простым:
movl 116(%esp), %eax
addl 112(%esp), %eax
addl 120(%esp), %eax
addl 124(%esp), %eax
и вам будет тяжело получить его гораздо более оптимизированным.