2009-09-30 13 views
14

Se si dispone di una classe che prevedo di essere utilizzata in migliaia di istanze in un'applicazione sensibile alla memoria, può essere d'aiuto se si calcola il calcolo delle funzionalità statiche per i membri statici?I membri statici aiutano l'efficienza della memoria?

Immagino che i metodi statici e le variabili siano memorizzati una volta per classe mentre per i membri non statici deve esserci qualcosa memorizzato per ogni istanza.

Con le variabili membro, sembra abbastanza chiaro, ma che tipo di dati vengono memorizzati per i metodi?

Sto lavorando in Java, ma immagino alcune regole generali da applicare anche in altri ambienti gestiti (come .NET).

risposta

17

L'unica differenza tra metodi statici e metodi nonstatic (istanza) dietro le quinte è che un parametro nascosto aggiuntivo (this) viene passato ai metodi di istanza e che i metodi di istanza potrebbero essere chiamati utilizzando un dispatch indiretto (se virtuale). Non c'è spazio aggiuntivo per il codice.

Edit:


La mia risposta si è concentrato sui metodi, ma sulla lettura più attenta vedo che la questione è di più su dati statici. Sì, i dati statici in un certo senso salveranno la memoria poiché c'è solo una singola copia di esso. Ovviamente, se i dati debbano essere statici o meno è più una funzione del significato o dell'uso dei dati, non del risparmio di memoria.

Se è necessario disporre di un numero elevato di oggetti e si desidera risparmiare memoria, è possibile esaminare anche se è applicabile lo 'Flyweight' pattern.

+3

No, ma ogni volta che si crea un'istanza di un oggetto è allocata nella memoria, con un oggetto statico questo non accade mai perché si ha sempre un solo oggetto. –

+0

@Jonas B - il tuo punto è preso. –

+0

Completamente soddisfacente, concentrandosi sui metodi. Penso di avere i dati statici abbastanza dritti e, come dici tu, il significato è più importante lì, comunque. –

4

La semplice risposta è sì. La creazione di un'istanza ogni volta che non ne esiste nessuno equivale a ricreare l'intero oggetto, i metodi e le variabili statici generalmente consumano meno memoria a seconda di come vengono utilizzati. Naturalmente se hai solo bisogno di creare un'istanza per l'intero programma, non c'è differenza. E ricorda che puoi sempre passare istanze come riferimenti in cui non puoi avere oggetti statici e devi riutilizzarli.

+0

A prima vista, almeno, e fino a quando non viene chiamato, l'unica memoria consumata da un metodo statico (o non statico) è per il codice di implementazione. Avere un parametro "questo" implicito che non viene mai utilizzato non dovrebbe fare alcuna differenza in questo - ciò che determina la dimensione del codice dei metodi è la complessità del metodo, non se è dichiarato statico o meno. – Steve314

15

La decisione non dovrebbe essere presa sulla base dell'efficienza: dovrebbe essere presa sulla base della correttezza.

Se la variabile rappresenta un valore distinto per ogni istanza, dovrebbe essere una variabile di istanza.

Se la variabile è un valore comune associato al tipo anziché a una singola istanza del tipo, dovrebbe essere una variabile statica.

Sei corretto, tuttavia, se hai una variabile statica, non la "pagherai" per quello con ogni istanza. Questo aggiunge un motivo in più per rendere variabili statiche dove non rappresentano parte dello stato dell'oggetto.

Quando parli dei metodi nella tua domanda, stai parlando di variabili locali? Otterrai un nuovo set di variabili locali per ogni chiamata al metodo, comprese le chiamate ricorsive. Tuttavia, questo non crea un nuovo set di variabili statiche o di istanza.

+0

Non avevo nemmeno pensato alle variabili locali, ad essere onesti. Mi chiedevo principalmente quali dati sono associati ai metodi dichiarati e in che modo differiscono tra statico e non. –

+0

Spero sempre che la correttezza mi dia l'efficienza in termini di smart JVM, OS e sviluppatori di hardware. ;-) –

3

Se si crea una variabile membro static, si salva la memoria peristanza (presupponendo che ci sia più di un'istanza), ma il vero vantaggio è che non si deve lavorare per mantenere tutti quei membri non statici coerenti con a vicenda e non è necessaria un'istanza corrente per accedere al membro statico.

Se si commette un metodo statico, si salva un paio di byte sullo stack per ogni chiamata nidificato (non c'e 'questo' parametro implicito), ma questo è rilevante solo se si sta facendo ricorsione molto pesante. Naturalmente se la funzione ha bisogno di sapere con quale istanza hai a che fare, avrai bisogno di un parametro esplicito per sostituire l'implicito 'questo' in ogni caso, in modo da non ottenere nulla.

Non esiste un costo per istanza per avere un metodo statico o, peraltro, un metodo non statico. I costi si verificano sulle chiamate.

Il vero motivo per utilizzare un metodo statico è perché non esiste un'istanza, almeno quando si chiama il metodo. Ad esempio, è possibile utilizzare un metodo statico per creare e inizializzare le istanze (uno dei modelli di progettazione "di fabbrica") o fare riferimento a un'istanza singleton.

Problemi correlati