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ć.
pisanie szybkiego kodu
long sA, sB;
sB = 17; sA = sB / 32;
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.