Ez a hatékonyság vagy növ EAX add eax, 1 verem túlcsordulás orosz

Elkezdte tanulmányozni a szerelő tudja, C / C ++. Szóval úgy döntött, hogy a tudat, hogy már ott van, és elkezdtem szétszedni az írásbeli kódot, és látni, hogy hogyan működik.

És azonnal belebotlottam egy logikátlan pillanatban.
Amennyiben a szerelvény függvénye értékének növelése az érvelés inc EAX. akkor különböznek, hogy 1 a nyilvántartáshoz add eax, 1.
Általában feltételezik, hogy ha vannak olyan funkciók, mint hogy azok hatékonyabbak. de ha megnézed a kódot i ++:

Mi jobb használni: inc, vagy add ebben az esetben?

Azt hiszem, a fordító egy bolond. Valószínűleg befolyásolja az a tény, hogy elméletileg az eredmény i ++ továbbra is használható, majd azért, mert, hogy ő megpróbálja megmenteni az eredményt az r \ EAX. Tény, hogy a fordító képes generálni

Ezen kívül, ott egyértelműen mint három utasítás egy helyett, és ez minden bizonnyal lassabb (kivéve, ha a értéke i ++ nem szükséges, akkor).

Ami a konkrét összehasonlítás add eax, 1 és inc EAX, akkor gyanítom, hogy a különbség a sebesség nem, de ez a szám 1 sor kerül, ami azt jelenti, hogy sor kerül a sorban előzetes letöltési kódot, és játszhat negatív szerepet. És nem tud játszani.

Másrészt, a fordító használ egy igazán kemény add eax, 1:

Ez ad az eredmény nélkül inc'a

Másrészt, a Java JIT-fordító használ néha inc. látta ..

Nos, a kérdés, persze, azt kérdezik! Ez annyira vas-függő dolog!

Az általános szabály egyszerű: mind a generáció egy szerelő fordító mindig okosabb kód (tudatosság), mint te. Ha így tesz, akkor jobb lenne.

Második gondolat: Ön alapuló hamis ígéretet. Az új gép az utasítások be nem mindig diktálta a számítási hatékonyság. Van még olyan dolog, mint a programozó hatékonyság - egyetértenek abban, inc EAX írni sokkal könnyebb, mint hozzá eax, 1.). És működése rendkívül gyakori.

Most miért adjunk gyorsabban inc. (Minden Írok nem szükséges, hogy igaz legyen - Csak azt hiszem). Az a tény, hogy a inc. Ellentétben add. Ez nem változtat az állam a carry flag. Néhány más zászlók változik. Mivel nem vagyok tisztában olyan architektúra, amellyel lehetővé válik, hogy a zászlókat egyenként, sem együtt, próbálom a következő adatokat: inc „első meg kell vizsgálni a jelenlegi állapotában a carry flag (ami okot ad hamis kapcsolata a későbbi fennakadást a szállítószalag). És add „benne nem szükséges, mert felülírja. Ezért a teljesítmény-növekedést.

Ui Fontos ismét: Én ezt nem nagyon jó még megérteni (kontakt hat hónappal később - úgy tűnik, az idő vagyok szakértő ezen a területen =)). Csak valahol valami ilyesmi hallott \ olvasni.

Válaszol február 14 '11 at 21:57

gcc (GCC) 3.4.5 (mingw-vista speciális r3)

Bruttó használ i ++ j ++

összeállításakor a -O3 ez általában megtartja változók nyilvántartásokban. gcc -S -O3

így (az időre) Kód:

Ami a végrehajtási sebesség. Személy szerint úgy gondolom, hogy az x86-végrehajtási sebességet egy ciklikus kód, egy elfogadható mérete a modern építészet végrehajtása, mint amilyennek látszik első pillantásra úgy néz ki, ugyanaz. Ez annak köszönhető, hogy előzetes letöltési parancsokat és átalakítjuk a parancsok RISC-szerű processzor mag.

Kapcsolódó cikkek