Mikor nem alkalmazható két adat felcserélésére a xor művelet?
Nem tudom, hogy ki volt az , aki töröltette az előző válaszomat?
Kérdező: Vajon mikor nem lehet két adatot az említett művelettel felcserélni?
Talán akkor, amikor a két adat tipusa nem egyezik, vagy amikor a két adat tipusa egyezik ugyan, de nem hajtható végre rajtuk a kivánt művelet.
Vagy mondjuk akkor, amikor architekturálisan nincs erre lehetőség.
A dolog jelentősége assembly szinten annyi, hogy két regiszter tartalmát lehet így felcserélni, kis költséggel, a MOV utasítás és extra memóriahely (magasabb szinten segédváltozó) használata nélkül.
xor ax,bx
xor bx,ax
xor ax,bx
Ja, csak rosszabb, hibás, és lassabb.
Olvasd el ezt: [link]
"Ja, csak rosszabb, hibás, és lassabb."
Nem ez volt a dolog lényege. A kérdésben ez szerepel.
Azon tól, az is hülyeség, hogy feltétlenül rosszabb, hibás és lassabb lenne.
Eleve, architektúrától függ, hogy lassabb-e vagy sem. Ugyanis, nem csak x86-os (x64) PC van a világon.
Szintén architektúrától függ, hogy megéri-e használni, mert bizony, van olyan kontroller, aminek a regisztere is és a RAM-ja is kevés, pl. csak 32 bájt, már pedig ilyenkor számíthat egy-két bájt mozgatása, tárolása is.
Az biztos, hogy hülye aki egy STM32-n használja, magas szinten, mondjuk C nyelvben, bájtos értékekre, de az már nem, aki pl. egy ST6-on szeretne így helyet spórolni, mert abban csak 64 bájt RAM van.
Ha nagy a mérete, és emiatt nem elemi típus, nem fér el 1 regiszterben, akkor ha párhuzamosan lehetnek más folyamatok is, akkor azok részlegesen felcseréltet láthatnak, ami sokszor nem jó. Ekkor zárolni kell, és úgy lehet.
Ha assembly kérdés: ha mindkettő a memóriában van, akkor ugye nincs xor mem,mem utasítás.
Ha magasszintű nyelvi kérdés: amikor konvertálni kell a típust, például az egyik egész, másik valós. Vagy ha van konstruktor, destruktor, = operátor, stb. Ezen esetekben a mérete is más lehet.
Na hogy sikerült? És ott mi volt az elvárás: a tanár szerint mi a helyes válasz? És mi az a parciális?
Egyébként félig felcseréltet láthat megszakítás, callback függvény, stb. miatt is, nem csak párhuzamosság miatt. Az optimalizációknál fontos, hogy ha mondjuk méretre optimalizálunk, és a kód meg hosszabb lesz, akkor lehet hogy optimalizálás helyett épp rontottunk. Egyébként itt a legfontosabb, hogy egy változót ne önmagával cseréljünk fel, mert annál hibás. 2 regiszterre jó, 2 memóriatartalmat felcserélni lassabb mint a hagyományos segédváltozós. Ha pedig mindig cserélni kell, akkor a fordító tudhatja is hogy felcseréltük és kész: valójában nem cseréli fel, nem végez műveletet, csak tudja hogy innentől kezdve a másik regiszterben van és kész. Attól hogy változó, még nem kell a memóriában legyen, lehet hogy csak regiszterben lesz, nem is lesz címe. Esetleg még akkor se ha a címére hivatkozunk hogy egy függvénynek átadjuk hogy hova írjon be valamit, vagy referenciával is lehet. Jók azok a fordító által végzett optimalizációk.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!