2016-07-15 131 views
7

so che le due seguenti affermazioni danno gli stessi risultati:differenza di prestazioni tra un + = b e a = a + b

a+=b; 
a=a+b; 

Nel caso di a += b, a viene valutata solo una volta, mentre nel caso di a = a + b , a viene valutato due volte.

C'è qualche differenza nelle prestazioni tra i due? In caso contrario, ci sono delle variazioni di cui sopra dove c'è una differenza?

+1

sì, il secondo riguarda più la digitazione .... –

+0

Che differenza ti aspetti? Differenza in quale contesto? La tua domanda è off-topic senza quelle osservazioni. – 2501

+0

Come internamente processo –

risposta

4

Dalla standard (sezione 6.5.16.2, punto 3):

un'assegnazione composto della forma E1op=E2 differisce dalla semplice espressione di assegnamento * E1 = E1op(E2) solo in quanto il lvalue E1 viene valutato solo una volta.

Cioè, se invece si sta facendo

*a += 1 

sarà solo determinare la posizione di destinazione una volta invece di due volte. Per le variabili "semplici" come nel tuo esempio, potrebbe non fare molta differenza. Naturalmente, se il compilatore sa che non è necessario farlo due volte, può comunque ottimizzare e farlo una sola volta. Nel caso ci siano altre entità che possono cambiare il puntatore (come un altro thread), c'è una vera differenza.

EDIT: Forse un esempio migliore è qualcosa di strano nel modo seguente (abusando del fatto che & b == & a-1 nel mio caso):

int a, b, *p; 

a = 1; b = 5; p = &a; 
*p += (--p == &b) ? 1 : 0; 
printf("%d %d\n",a,b); // prints 1 6, because --p happens first, then *p 

a = 1; b = 5; p = &a; 
*p = *p + ((--p == &b) ? 1 : 0); 
printf("%d %d\n",a,b); // prints 1 2, because the second *p is evaluated first, 
         // then --p and then the first *p 
+3

Non è il 2 ° caso anche UB a causa dei punti di sequenza? – glglgl

+1

@glglgl Sì, gli esempi non hanno senso. E causa un comportamento indefinito per diversi motivi separati. – 2501

+0

Sì, tecnicamente entrambi hanno un comportamento indefinito, ma ciò non significa che non abbiano significato, direi. Semplicemente facendo a + b può comportare un comportamento indefinito. Dubito che molti programmatori aggiungano controlli per assicurarsi che tutto vada bene in questi casi. Nel contesto di uno specifico compilatore, penso che l'esempio faccia un buon lavoro per illustrare la differenza tra le due forme. Naturalmente, esempi migliori sono sempre ben accetti. – mweerden

1

a+=1 è probabilmente il modo migliore per andare (Tuttavia la differenza di prestazioni è quasi insignificante). Dovresti cercare altre parti del tuo codice se stai cercando di ottenere alcuni miglioramenti delle prestazioni.