Quali sono i pro e i contro dell'uso di "riferimenti" temporanei?

2

In C e C ++ (e credo che altri linguaggi che consentono di prendere un "riferimento" a un elemento dell'array o qualcosa di simile), quando si ha un tipo di array, l'accesso ai singoli elementi di tale array può essere fatto "direttamente" o tramite un riferimento temporaneo o un puntatore.

Esempio:

// Like this:
for(int i=0; i<n; ++i) {
   theArray[i].frobnicate();
   theArray[i].shrub();
   if(i % 2) {
      theArray[i].modulize();
   }
}

// Or like this:
for(int i=0; i<n; ++i) {
   TheType& elem = theArray[i];
   elem.frobnicate();
   elem.shrub();
   if(i % 2) {
      elem.modulize();
   }
}

Ovviamente if il corpo del loop diventa troppo complesso dovrebbe essere usato un refactoring e l'intero accesso si sposta su una funzione / metodo separato che funzionerebbe naturalmente su un singolo elemento dell'array, ma per i casi in cui vi sono poche acess che vengono utilizzate solo in un ciclo, può essere più conveniente tenerle direttamente nel ciclo.

Abbiamo discusso su quale forma dovremmo preferire nel nostro team e le opinioni sono contrastanti, quindi mi interessa sapere se esistono alcune linee guida, specialmente wrt. C ++.

Modifica: questo è puramente di stile se vuoi. Le prestazioni sono irrilevanti, in quanto il nostro compilatore C ++ dovrebbe effettivamente generare esattamente lo stesso codice in entrambe le versioni.

    
posta Martin Ba 10.08.2011 - 16:21
fonte

3 risposte

3

Ogni approccio ha vantaggi.

L'approccio di riferimento temporaneo ha il vantaggio di arrivare al nome del riferimento. Questo può fornire ulteriori informazioni per aiutare a rendere il codice più auto-esplicativo. Elimina inoltre più istanze della stessa espressione per accedere alla variabile.

L'approccio senza riferimento è più breve di una riga. E se accedi al membro solo una o due volte, il vantaggio di eliminare più istanze è molto inferiore.

Ho scritto documenti di pratiche di codifica. Se ritieni di dover avere una politica in merito, ti suggerirei di notare i vantaggi di ciascuno e di raccomandare l'approccio di non riferimento in cui il codice è semplice e l'approccio di riferimento in cui l'espressione sarebbe ripetuta più volte o il riferimento denominato aggiunge per leggere la leggibilità.

Non devi avere una regola per ogni cosa, specialmente dove non c'è un chiaro vantaggio principale di nessuno dei due approcci e nessun problema specifico che stai cercando di evitare.

    
risposta data 13.08.2011 - 08:50
fonte
8

Non c'è niente di sbagliato nel prendere quei riferimenti temporanei - in effetti può essere preferibile in alcuni casi perché puoi nominare il riferimento. Se quel particolare riferimento ha un ruolo particolare che potrebbe non essere immediatamente evidente dall'indice dell'array, allora il nome aggiungerà chiarezza.

Se la discussione si concentra sulle "prestazioni", allora la linea guida è la stessa della maggior parte delle micro-ottimizzazioni: provala, profila il profilo e / o guarda il codice assembly emesso. Prendi le tue decisioni basandoti su fatti concreti, non su linee guida sfocate.

    
risposta data 10.08.2011 - 16:29
fonte
0

Non è uno stile che ho visto spesso (anche se mi ricorda il Pascal con), ma penso che sia solo una questione di familiarità, non ho nulla di strong contro di esso. Due punti:

  • sembra fragile se l'indice o l'array viene modificato durante il ciclo, che tendo a considerare tale modifica peggio di quell'uso di riferimento,

  • è vicino in effetti al nuovo per la sintassi in C ++ 0X - Non mi sorprenderebbe vedere in futuro le macro che si espandono a qualcosa di simile a questo o il nuovo per la sintassi per il gusto di un facile transizione.

risposta data 10.08.2011 - 16:29
fonte

Leggi altre domande sui tag