На этом шаге мы рассмотрим способы оптимизации транслятором Visual C++ 6.0.
Напомним, что мы рассматриваем оптимизацию следующей C-программы:
#include <iostream.h> #include <conio.h> void main() { int i; char a[10]; char b[11]; for(i=0; i<10; i++) { a[i]='a'; *(b+i)='a'; cout << a[i] << " " << b[i] << endl; } getch(); }
Приведем текст дизассемблированной программы, оптимизированный транслятором Visual C++ 6.0:
.text:00401000 sub_401000 proc near ; CODE XREF: start+AFp .text:00401000 push esi .text:00401001 push 0Ah .text:00401003 pop esi .text:00401004 .text:00401004 loc_401004: ; CODE XREF: sub_401000+3Bj .text:00401004 push 61h .text:00401006 mov ecx, offset dword_408AA8 ; ostream::operator<<(uchar) .text:0040100B call ??6ostream@@QAEAAV0@E@Z .text:00401010 push offset unk_408050 .text:00401015 mov ecx, eax ; ostream::operator<<(char const *) .text:00401017 call ??6ostream@@QAEAAV0@PBD@Z .text:0040101C push 61h .text:0040101E mov ecx, eax ; ostream::operator<<(uchar) .text:00401020 call ??6ostream@@QAEAAV0@E@Z .text:00401025 push offset loc_401053 .text:0040102A push 0Ah .text:0040102C mov ecx, eax ; ostream::operator<<(uchar) .text:0040102E call ??6ostream@@QAEAAV0@E@Z .text:00401033 mov ecx, eax .text:00401035 call sub_401044 .text:0040103A dec esi .text:0040103B jnz short loc_401004 .text:0040103D call __getch .text:00401042 pop esi .text:00401043 retn .text:00401043 sub_401000 endp
Взгляните на текст С-программы. Заданные нами два символьных массива - абсолютно ни к чему. Транслятор Visual C++ очень точно это подметил и изменил код так, что, как ни старайся, текст исходной программы восстановить не удастся. Конечно, такая оптимизация оказалась возможной только потому, что наши массивы используются в ограниченной области.
Рассмотрим далее некоторые способы оптимизации, которые могут пригодиться нам и при написании программ на ассемблере.
P1 PROC . . . . CALL P2 RET P1 ENDP . . . . Р2 PROC . . . . RET P2 ENDP
Данный фрагмент можно заменить более эффективным. Подобный подход можно часто встретить, просматривая отладчиком код программы.
P1 PROC . . . . JMP P2 P1 ENDP . . . . Р2 PROC . . . . RET Р2 ENDP
Код становится и быстрее, и короче, вот только разобраться в нем становится сложнее.
На следующем шаге мы рассмотрим представление объектно-ориентированной программы.