Marooned napisał(a)
Należy dodać jeszcze, że znajomość Assemblera może znacząco wpłynąć na optymalność kodu pisanego w języku wyższego poziomu.
Oj może, może... :/
Marooned napisał(a)
[...] to sprawdzając parzystość liczby w wielkiej pętli zamiast zrobic tak (bardzo popularne)
if (a%2) {}
zrobisz tak
if (a&1) {}
Widzisz Panczo, to jest argument dla którego NIE należy uczyć się assemblera albo inaczej - nie należy przenosić wiedzy z assemblera do języka wyższego poziomu. Dlaczego? Ano to nie ma żadnego znaczenia dla kompilatora czy zapisze a%2, czy a&1, to w ogóle mnie nie interesuje co on wygeneruje, a wygeneruje identyczny kod, a jeśli nawet nie - to co z tego??? Kompilator optymalizuje(!) kod i to bardziej globalnie niż człowiek. Nie uważajcie mnie za konserwatystę kompilatorowego, ja naprawdę programowałem w asm+rev.eng :>
Z drugiej strony asm przydaję się ale proszę nie uogólniajcie... I nie wymyślajcie własnych teorii dlaczego coś tak działa.
Rozumiem, że działania modulo vs. and miało dać efekt: dzielenie vs operacja bitowa... No niestety, tak nie musi być :P
Kod cpp:
#include <stdio.h>
int main()
{
int a;
scanf( "%d", &a );
if ( a % 2 ) printf("a");
if ( a & 1 ) printf("a");
unsigned int b = a;
if ( a % 2 ) printf("b");
if ( a & 1 ) printf("b");
int tab[1000];
for (int i=0; i<1000; i++)
if (tab[i]%2) printf("t");
for (int i=0; i<1000; i++)
if (tab[i]&1) printf("t");
}
GCC 3.4.2 (x86, flaga -O1), fragmenty dla testów:
; [...]
;
; test w ifach
; zauważcie optymalizację kompilatora printf("a") do putchar() !!
;
call _scanf
testb $1, -4012(%ebp)
je L2
movl $97, (%esp)
call _putchar
L2:
testb $1, -4012(%ebp)
je L3
movl $97, (%esp)
call _putchar
L3:
testb $1, -4012(%ebp)
je L4
movl $98, (%esp)
call _putchar
L4:
testb $1, -4012(%ebp)
je L5
movl $98, (%esp)
call _putchar
L5:
; [....]
;
; testy w pętlach
;
L10:
testb $1, -4008(%ebp,%ebx,4)
je L8
movl $116, (%esp)
call _putchar
; [....]
testb $1, -4008(%ebp,%ebx,4)
je L13
movl $116, (%esp)
call _putchar
L13:
Testy są identyczne
test $1, value
, a nie inaczej :D
Ta wiedza assemblerowa naprawdę jest w kompilatorze.