Qual è la differenza di memoria tra una variabile assegnata a null e una non assegnata

8

Qual è la differenza di memoria tra una variabile assegnata a null e una non assegnata?

So che c'è una differenza nell'utilizzo, ma qual è la differenza nella memoria?

    
posta abu_abdelbarr 06.04.2015 - 13:57
fonte

3 risposte

11

Non c'è differenza tra i due "in memoria".

Dalla Specifica del linguaggio Java, 4.12.5 . Valori iniziali delle variabili :

Every variable in a program must have a value before its value is used:

  • Each class variable, instance variable, or array component is initialized with a default value when it is created (§15.9, §15.10.2):

...

    • For all reference types (§4.3), the default value is null.

...

    • A local variable (§14.4, §14.14) must be explicitly given a value before it is used, by either initialization (§14.4) or assignment (§15.26), in a way that can be verified using the rules for definite assignment (§16 (Definite Assignment)).

Le variabili di riferimento a livello di classe o oggetto saranno assegnate a un valore nullo.

Le variabili di riferimento a livello di metodo (stack) avranno un valore non specificato (usando il termine C ++). In pratica questo è spesso nullo, ma lo standard non specifica che è nella variabile di riferimento, ma solo che deve essere assegnato prima dell'uso. L'utilizzo di una variabile di riferimento sullo stack in un modo diverso dall'assegnazione come primo utilizzo comporterà un errore di compilazione.

    
risposta data 06.04.2015 - 14:12
fonte
4

What is the difference between a variable assigned to null and others not assigned in memory?

Non esiste una variabile non assegnata in Java. Ai membri delle classi che non hanno un'assegnazione esplicita viene assegnato il valore predefinito per il tipo, null per un oggetto o qualcosa di simile a 0 per i tipi primitivi.

Le variabili locali vivono in pila. (Anche i locals non primitivi come MyType foo vivono nello stack, come riferimenti.) L'allocazione dello stack è semplice. Se un blocco contiene dichiarazioni per variabili locali, lo spazio necessario a tali variabili locali è riservato nello stack. Il fatto che i valori siano assegnati a quelle variabili locali sulla regolazione dello stack per accogliere tali variabili locali è irrilevante.

La ragione per cui non importa è se le variabili locali sono o non sono assegnate ad un valore nel momento in cui l'esecuzione entra nel blocco è duplice. Una ragione è che la dimensione necessaria non cambia. I primitivi hanno una dimensione fissa e i non primitivi sono in realtà riferimenti. (L'oggetto referenziato vive sull'heap piuttosto che sullo stack.) La seconda ragione è che l'utilizzo di una variabile locale a cui non è stato assegnato un valore è un errore di compilazione. Questo lascia al Java runtime se fornire qualche valore (non necessariamente quello predefinito) ad una variabile locale dichiarata ma non assegnata.

    
risposta data 06.04.2015 - 14:31
fonte
1

Innanzitutto, non c'è davvero bisogno di preoccuparsi dello spazio utilizzato dalle variabili locali. In una riga posso allocare un array di 100.000 interi che occuperà più spazio di tutte le variabili locali che userete.

In secondo luogo, il tuo codice è compilato da un compilatore che probabilmente è intelligente. Se la variabile non è inizializzata, non viene utilizzata (perché il compilatore non consente di utilizzare variabili non inizializzate). Ma se lo si inizializza a zero, non viene ancora utilizzato! Il compilatore capirà facilmente che non viene usato e in realtà non utilizza affatto lo spazio per la variabile. Anche se è usato, il compilatore capirà facilmente che il valore è zero e usa nil invece della variabile.

Ma in terzo luogo, si tratta di micro-ottimizzazioni che non ti aiuteranno a ottimizzare un programma in alcun modo. Stai cercando di salvare quattro o otto byte. Concentrati sul salvataggio di megabyte se vuoi salvare qualcosa.

Infine, mentre alcune persone sostengono che le variabili dovrebbero sempre essere inizializzate, ciò non è vero in Java. Devi sempre impostare una variabile su un valore significativo. Diciamo che vuoi impostare una variabile sul nome di una persona e ti dimentichi di farlo in un percorso di codice. Se si inizializza ciecamente la variabile su zero, il compilatore non può dirlo. Senza l'inizializzazione, il compilatore può e ti dirà del tuo errore.

    
risposta data 06.04.2015 - 15:22
fonte

Leggi altre domande sui tag