Domanda

Nella mia classe di Informatica II, il professore considera ++, -, * =, ecc. come 2 operazioni. Tuttavia, a livello di Assemblea non si tratta in realtà di due operazioni. Qualcuno può spiegare o è solo per motivi di semplicità?

È stato utile?

Soluzione

Considererei in realtà 3 operazioni: lettura, incremento (o qualunque altra cosa), scrittura. Ciò presuppone che stia leggendo da una sorta di memoria condivisa in una sorta di memoria locale (ad es. Registro o stack), operando sulla memoria locale, quindi riscrivendo.

Quante operazioni è a livello di assembly dipenderà da ciò che si sta incrementando, dalla piattaforma, dall'hardware ecc.

Altri suggerimenti

Perché ++ (ex: b ++) è una semplificazione di

b = b + 1 

Ci sono due operazioni lì, l'aggiunta (b + 1) e quindi l'assegnazione del valore dell'aggiunta alla variabile originale.

Perché preoccuparsi quando si esegue l'analisi della complessità? È solo O (1) :-)

EDIT: per favore fatemi sapere perché quando lo votate verso il basso. Poiché la domanda è taggata complessità , presumo che la grande nozione O sia la più importante, piuttosto che le costanti effettive. Inoltre, come già menzionato in altre risposte, quante operazioni dipendono da molti fattori: il modo in cui conti operazioni, piattaforma, compilatore, ecc.

Lancerò alcune ipotesi.

  • Il tuo professore si riferisce a lingue interpretate?
  • ++ i è diverso da i ++ forse si riferisce a quello?
  • Forse la sua lingua preferita di assembly ha bisogno della variabile di memoria intermedia?

    add reg_temp, reg_i, 1
    mov reg_i, reg_temp
    

Non è un'aggiunta più un setter?

Simile a i + = 1?

Probabilmente il prof si sta semplicemente riferendo a dover prendere il valore, aggiungere 1 ad esso e quindi assegnarlo di nuovo alla variabile.

A livello di assembly tutto viene fatto nei registri, quindi con una variabile in A

ADD AX,1

Tuttavia, nelle lingue compilate tutto deve essere archiviato in modo che i ++ diventi (in pseudo assembly)

MOV AX,i
ADD AX, 1
MOV i, AX

Che sono tre operazioni ... A meno che non abbia dimenticato completamente la mia architettura di base ...

Mi hai ricordato un Kinda " La giuria non è fuori " problema che ho sentito molto tempo fa.

  

" Preincrement è più veloce del postincrement "

Ho appena fatto una rapida ricerca su Google.

  1. Molte persone continuano a ritenerlo vero.
  2. Altri affermano che i compilatori sono così ottimizzati, che il codice comparativo di alto livello non può essere confrontato.
  3. Tuttavia altre persone sostengono che non c'è differenza .

Secondo me dovrebbe essere più di 2 poiché ha due significati a seconda del contesto e devo sempre ricordarmeli quando lo vedo.

a = b ++ è uguale a a = b; b = b + 1

e

a = ++ b è uguale a b = b + 1; a = b

Questa è una certa confusione per mandare fuori dalla scogliera la maggior parte degli studenti del primo anno.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top