2012-02-22 12 views
5

ho un oggetto che è necessario attraverso il gioco in ogni 10 secondi. devo continuare a cancellare l'oggetto o continuare ad usare lo stesso oggetto? dove si trova l'oggetto nel cosiddetto "tempo libero"?ciò che è più costoso per la memoria. "creare ed eliminare oggetti" o "riutilizzare un oggetto"?

dato che si tratta di un gioco mobile, la memoria è una preoccupazione. quindi, volevo solo sapere quale metodo sarebbe fruttuoso.

"creating and deleting objects" ? 

o

"reusing a object" ? 

grazie

+1

riutilizzare un oggetto o una memoria? Cosa intendi dei due? – Arunmu

+1

dipende. dipende dalle tue esigenze, dipende dalla tua scelta di allocatore, dipende dall'oggetto, dipende dai modelli di utilizzo.prova a chiarire le tue esigenze e poi ** misura ** –

risposta

3

Questo dipende molto dalla natura dell'oggetto e l'uso della memoria del resto del programma, ma come una regola empirica:

Se è necessario l'oggetto in tutto il programma, tenerlo in memoria. Se è piccolo, non importa. Se è grande, ricrearlo ogni dieci secondi sarà un problema per il processore e le allocazioni potrebbero contribuire allo memory fragmentation.

Se si sceglie di mantenere vivo l'oggetto come suggerito, mentre non viene utilizzato, esso vivrà nella RAM e occuperà un po 'di spazio (presumendo che la piattaforma mobile non abbia memoria di scambio).

1

Riutilizzare l'oggetto è più economico, soprattutto se la creazione e l'eliminazione delle operazioni sono costose (disegno, accesso al disco, download), ma la presenza di troppi oggetti riutilizzabili nella cache potrebbe riempire la memoria.

0

Quando un oggetto non viene più utilizzato, viene chiamato il distruttore per liberare la memoria. Ma se poi crei un nuovo oggetto dello stesso tipo, viene chiamato il costruttore per allocare nuova memoria. Questo certamente riduce le prestazioni (in pratica, tuttavia, dipende anche da quanto è grande l'oggetto), quindi se non hai più bisogno di un oggetto durante l'esecuzione del programma, dovresti riutilizzarlo cambiando il suo contenuto.

+0

"il costruttore viene chiamato per allocare nuova memoria" - non proprio. Il costruttore potrebbe allocare memoria, potrebbe non farlo. –

+1

@SteveJessop: il costruttore viene in genere utilizzato per allocare nuova memoria. Inoltre, il costruttore predefinito _ richiama i costruttori predefiniti di tutti i membri che li hanno. Se c'è un membro con alcuni costruttori, ma senza uno predefinito, allora è un errore in fase di compilazione_ (vedere [qui] (http://stackoverflow.com/questions/4837223/c-default-destructor)). – enzom83

+0

Il mio punto è che l'allocazione della memoria è separata dalla costruzione. I costruttori allocano la memoria solo se hanno una linea (o una riga in una classe base o un costruttore membro) che alloca memoria, con 'new' o' malloc' o altro. –

1

Che cosa dice il tuo profiler?

Dipende in gran parte dall'oggetto, dal compilatore e dai tipi di utilizzo che stai facendo . L'unica volta che l'ho confrontato (e std::string nella libreria g++, la libreria g++, reinizializzata ogni volta tramite un ciclo), ricostruire l'oggetto ogni volta nel ciclo era più veloce. Sull'altra mano , la maggior parte degli altri contenitori standard conserva la loro memoria anche quando svuotata; in questi casi, se si definisce il contenitore al di fuori del ciclo , esso (di solito) arriverà alla sua dimensione finale abbastanza rapidamente, dopo che non ci saranno altre allocazioni.

E, naturalmente, è necessario considerare quanto sia difficile ripristinare l'oggetto in uno stato pristineo . È quasi impossibile per gli oggetti derivati ​​da std::ios_base, ad esempio; quasi sempre vuoi usare un nuovo std::ostringstream, piuttosto che provare a riutilizzarne uno esistente. Nonostante il costo.

+0

Effettuare test di memoria in un ciclo semplice non è corretto. Il motivo è che continuerà a creare e distruggere oggetti nello stesso ordine, quindi l'unico blocco sulla memoria può essere continuamente riutilizzato (cioè, il gestore della memoria non ha alcun lavoro da fare). –

+0

@ edA-qamort-ora-y Forse. Ma questo era il problema al momento: era più veloce riutilizzare un 'std :: string' dichiarato sopra il ciclo, o per ricreare uno ogni volta attraverso il ciclo, assegnandogli un nuovo valore. E sono abbastanza sicuro che i risultati sono un artefatto dell'implementazione g ++ di 'std :: string': come con tutte le misurazioni, non c'è assolutamente alcuna garanzia che si finisca con risultati simili con un compilatore diverso e una libreria diversa . Il mio punto era solo che non si può dire senza misurare. –

+0

Sto solo aggiungendo che è difficile misurare correttamente e che i semplici loop isolati non sono di solito un test corretto. –

Problemi correlati