Шаг 123.
Оптимизация кода: транслятор Visual C++ 6.0

    На этом шаге мы рассмотрим способы оптимизации транслятором 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++ очень точно это подметил и изменил код так, что, как ни старайся, текст исходной программы восстановить не удастся. Конечно, такая оптимизация оказалась возможной только потому, что наши массивы используются в ограниченной области.

    Рассмотрим далее некоторые способы оптимизации, которые могут пригодиться нам и при написании программ на ассемблере.

    На следующем шаге мы рассмотрим представление объектно-ориентированной программы.




Предыдущий шаг Содержание Следующий шаг