164

164



0040EDA1 sar 0040EDA4 mov


ecx,5

dword ptr [ebp-OCh],ecx

return 0;

}


Kod, który zostaje wygenerowany przez kompilator, wcale nie musi być tym, czego się spodziewamy. Rozważmy na przykład instrukcję a=b/32 w kodzie źródłowym. Analizując wygenerowany kod w języku maszynowym (który w tym wypadku został skompilowany z zastosowaniem optymalizatora zmniejszającego zajętość pamięci), widzimy, że kompilator użył operacji shr. (Operacja ta jest oczywiście o wiele szybsza niż operacja div.)

Jeśli zamiast liczb bez znaku, użyjemy liczb ze znakiem, tak jak w instrukcji sA=sB/32, to kompilator doda całą masę kodu, w celu poradzenia sobie ze znakami liczb. Zastosowanie operatora » spowoduje wygenerowanie znacznie szybszego kodu. Widzimy zatem, że w wypadku zmiennych ze znakiem, takich jak typu long, o których wiemy, że mają dodatnią wartość, znacznie lepiej wykonać przesunięcie bitowe niż dzielenie.

Płynie stąd morał taki, że nie należy zakładać, że wiemy, jaki kod zostanie wygenerowane przez kompilator. Sposób zapisania wyrażeń może znacznie ten kod zmienić.

Przesunięcie bitowe jest szybsze niż dzielenie

pisanie szybkiego kodu

Przed

long sA, sB;

sB = 17; sA = sB / 32;

Po

long sA, sB;

sB = 17; sA = sB » 5;

Operatory przesunięcia bitowego (« oraz ») są o wiele szybsze niż dzielenie. W wypadku dzielenia potęg dwójki zamiast zwykłej operacji dzielenia lepiej zastosować operatory przesunięcia. Pamiętajmy oczywiście o tym, że można ich używać tylko z liczbami całkowitymi.


Wyszukiwarka

Podobne podstrony:
0040EDA1 sar 0040EDA4 mov ecx,5 dword ptr [ebp-OCh],ecx return 0; } Kod, który zostaje wygenerowany
0040EDA1 sar 0040EDA4 mov ecx,5 dword ptr [ebp-OCh],ecx return 0; } Kod, który zostaje wygenerowany
238 TIF 0040F12A shr eax,5 0040F12D mov dword ptr [idw],eax */ idw = ibit / cbitDWORD; if(m_rgdw[idw
0040F12A shr eax,5 0040F12D mov dword ptr [idw],eax */ idw = ibit / cbitDWORD; if(m_rgdw[idw] &
238 TIF 0040F12A shr eax,5 0040F12D mov dword ptr [idw],eax */ idw = ibit / cbitDWORD; if(m_rgdw[idw
05vcu10 Disassembly n
mov ecx, tekst 1 = standardowe wyjście = ekr ECX = adres (offset) tekstu mov edx, dlugosc edx =
192 TIF 379:} 0040186B mov esp.ebp 0040186D pop ebp 0040186E ret 8 //Konwencja cDecI dla funkcj
192 TIF 379:} 0040186B mov esp.ebp 0040186D pop ebp 0040186E ret 8 //Konwencja cDecI dla funkcj
174 TIF Znaleziono: mov eax, cch sub eax, ecx Koniec: dec eax }} #pragma warning( default:
192 TIF 379:} 0040186B mov esp.ebp 0040186D pop ebp 0040186E ret 8 //Konwencja cDecI dla funkcj
379:} 0040186B mov esp.ebp 0040186D pop ebp 0040186E ret 8 //Konwencja cDecI dla funkcji składo

więcej podobnych podstron