Оптимизация ветвлений

Одним из приемов оптимизации кода является организация сложной системы переходов для выполнения команд в теле цикла и/или выхода из цикла. Например, приведенный ниже программный код на языке С может быть преобразован компилятором следующим образом:

Исходный код Код после оптимизации
flag = 0; while (!flag) { ...aaa... stml (); ...bbb... if (e1) break; ...ccc... if (e2) { ...ddd... flag = 1; ...eee... } } if (flag) { ...ttt... stm2 (); } L1: ...ааа... stml (); ...bbb... if (e1) goto L2; /* через stm2,т.к.flag1=0 */ ...ccc... if (!e2) /* if!e2 в начало */ goto L1; ...ddd... ...eee... ...ttt... stm2 (); L2:

Компилятор определяет, что вход в цикл выполняется в любом случае и поэтому функция stml() будет вызываться всегда. Компилятор также определяет, что stm2() никогда не будет выполнена, если flag=0 и если e1=1 – тогда flag "навсегда останется" = 0. Эти сведения позволяют компилятору сгенерировать более эффективный код (естественно, при разработке программы приведенным справа "стилем" программирования пользоваться не рекомендуется).

Inline- функции

Inline-функции нашли широкое применения и поддерживается всеми компиляторами, например языка программирования С/С++. Как известно, он позволяют повысить производительность программы за счет замены вызова функции самим телом функции. Это может выглядеть, например, так:

Исходный код Код после оптимизации
void swap (int *a, int *b) { int t = *a; *a = *b; *b = t; } main() { swap(&x,&y); } main() { int t=x; x = y; y = t; }

Обычно такой подход может приводить к увеличению объема кода, особенно при многочисленных вставках. Однако в программах на объектно-ориентированных языках зачастую встречаются функции, состоящие из одной-двух строк и команды возврата. В этом случае, даже если функция в программе не описана как inline, компилятор (при установке соответствующих опций) самостоятельно пытается "внедрить" ее тело вместо вызова, но только в том случае, если это не приведет к увеличению объема кода.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: