Gli operatori pre e post incremento / decremento in C ++ hanno le stesse prestazioni in un ciclo? [duplicare]

StackOverflow https://stackoverflow.com/questions/631506

  •  08-07-2019
  •  | 
  •  

Domanda

Considera i seguenti due esempi.

class ClassOne
{
 //class definition is here
};

std::vector< ClassOne > myListOfObjects;

std::vector< ClassOne >::const_iterator iter = myListOfObjects.begin();

Example 1: 
for( ; iter < myListOfObjects.end(); **++iter**)
{
   //some operations
}

OR

Example 2: 
for( ; iter < myListOfObjects.end(); **iter++**)
{
   //some operations
}

Quale è più veloce? ++ iter o iter ++ nel contesto di loop.

Chiusura Fro motivo:

Copiato da Brian's Post (per rendere la domanda più concisa).

Puoi anche provare una di queste domande simili: qui o qui o qui o qui .

È stato utile?

Soluzione

Come indicato in questa risposta , pre è più veloce. Sono gli stessi solo quando hai a che fare con i primitivi (int, char, ecc.). In questo caso, stanno chiamando operatori sovraccarichi.

Altri suggerimenti

No, non hanno le stesse prestazioni:

  • Postincrement creerà una copia, quindi incrementerà, quindi restituirà la copia
  • Il preincremento aumenterà quindi restituirà l'originale

Quindi (a meno che tu non stia gestendo cose semplici come gli ints) il preincremento è più veloce.

Dipende. In un compilatore ingenuo, il preincremento sarà più veloce. In pseudocodice, ecco cosa fanno ciascuno di essi:

preincrement() {
  val = val + 1;
  return val;
}

postincrement() {
 tmp = val; // take a temporary copy of the old value
 val = val + 1;
 return tmp;
}

In pratica, il compilatore spesso trasforma un postincrime in preincremento quando può cavarsela. Ma per tipi complessi, potrebbe non essere in grado di farlo. Come regola generale, usa il preincremento ogni volta che puoi e usa postincrmenet solo quando hai bisogno della semantica specifica di quell'operazione.

Quando si tratta di tipi non primitivi: ++ iter sarà sempre più efficiente.

Il motivo per cui ++ iter è più efficiente dipende dal lavoro che ciascuno deve fare per ottenere il proprio valore di ritorno. Non importa se il valore restituito viene effettivamente utilizzato o meno.

La differenza:

  • ++ iter restituisce un riferimento a se stesso , quindi non è necessaria alcuna copia temporanea. (incremento, restituisce riferimento al proprio valore)

  • iter ++ restituisce una copia temporanea della variabile (crea temp var con valore precedente, incremento, return var var)

    _Myt _Tmp = *this;
    ++*this;
    return (_Tmp);
    

Puoi anche provare una di queste domande simili: qui o qui o qui o qui . Non sono esattamente gli stessi, tuttavia, poiché non si applicano agli iteratori.

Sono quasi sicuro che si riducono alla stessa cosa nel codice macchina, solo in un ordine diverso. Direi che sono uguali, ma ti consiglio di scrivere un'app di prova rapida per verificare.

Il pre-incremento è, in generale, migliore, a condizione che tu non abbia un'esigenza specifica di post-incremento.

Tuttavia, questa è una cosa specifica del compilatore. La maggior parte dei compilatori moderni creerà meno operazioni per una notazione con prefisso. Con i sovraccarichi del metodo di classe, questo non viene sempre ottimizzato, poiché dipende da come viene implementata la classe.

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