( uid_6201 | 2017. 12. 28., cs – 18:36 )

Két eltérő verziójú C fordító közül az újabb gyakran tud még olyan gyorsítási trükköket, amit a régi nem. Ez lehet utasításbeli (pl. AVX alkalmazása), vagy pusztán utasítás idők alapján másképp számolja.

Elnagyolt példa egy ősrégi és egy mai C fordító eltérő kódjára:

int modulo10(int number) {
    return number%10;
}

Ezt réges-régen a "div" assembly utasítással tanultuk, amely az EDX:EAX regiszterpárban levő értéket elosztja a div argumentumával. Eredmény EAX-ben, maradék EDX-ben. Ez utóbbit adja vissza a függvény elvileg.

Viszont ha a fenti kódot lefordítod GCC-vel, akkor abban nem lesz div, annál inkább szorzás, szándékos túlcsordulás, shiftelés, kivonás, összegzés. Ennek segítségével a proci a hardveres DIV utasításánál gyorsabb megoldást tud csinálni. Furcsa elsőre, de nézd meg magad is, hogy mit fordít belőle a GCC -O2 hatására.

A fenti egy elnagyolt példa, már régen nem div-et használ erre a GCC, de vannak olyan napi dolgok, ahol az új verzióban szintén bevetnek ilyen trükköket.

Az viszont biztos, hogy a kiszámolt eredmény egyik esetben sem lehet a valóságtól eltérő. A lefordított kiszámoló program utasításai viszont a más verziójú C fordító esetén lehet más, általában gyorsabb futású megoldás.