C'è prestazioni da guadagnare spostando l'allocazione di archiviazione locale a una funzione membro alla sua classe?

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

Domanda

Supponiamo che io ho la seguente classe C ++:

class Foo
{
  double bar(double sth);
};

double Foo::bar(double sth)
{
  double a,b,c,d,e,f
  a = b = c = d = e = f = 0;
  /* do stuff with a..f and sth */
}

La funzione bar () sarà chiamato milioni di volte in un ciclo. Ovviamente, ogni volta che viene chiamato, le variabili A..F devono essere assegnato. Avrò ottenere alcun rendimento, rendendo le variabili A..F membri della classe Foo e solo loro inizializzazione al punto di ingresso della funzione? D'altra parte, i valori di A..F saranno dereferenziati attraverso this->, quindi mi chiedo se non è in realtà un possibile peggioramento delle prestazioni. C'è qualche testa per l'accesso a un valore tramite un puntatore? Grazie!

È stato utile?

Soluzione

L'accesso a variabili di stack-allocato è più veloce rispetto ai membri della classe. variabili di stack sono dereferenziati utilizzando stack pointer, senza l'utilizzo di un puntatore di classe. Aggiungere nuovi membri della classe solo se è richiesto dal algoritmo del programma. variabili inizializzare lo stack direttamente nella dichiarazione:

doppia a = 0.0, b = 0.0 ...

Altri suggerimenti

su tutte le architetture che conosco allocazione / deallocazione di built-in è fatto manipolando il registro stack. Suppongo che questo richiede pochissimo tempo a tutti rispetto al resto della funzione.

Se si ritiene che l'incremento / decremento di un valore in un aiuto potrebbe registro del processore, sei giù di micro-ottimizzazioni. Essi dovrebbero essere fatte come l'ultima cosa prima della spedizione e (come tutte le ottimizzazioni) dovrebbero essere guidati da di misura , non indovinando.

Se le variabili sono davvero locale alla funzione e sono utilizzati in nessun altro luogo, allora dovrebbero essere locale alla funzione. Non riesco a vedere come che li rende membri aumenterà le prestazioni. Tuttavia si dovrebbe utilizzare l'inizializzazione piuttosto che l'assegnazione:

double a = 0, b = 0, c = 0, d = 0, e = 0, f = 0;

Questo può o non può essere significativo per i doppi, ma certamente sarà per tipi definiti dall'utente, come le stringhe.

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