2009-11-03 15 views
12

quando si fa in questo modo:Quanta memoria ha una costante in C?

const int a = 5; 

mi chiedo se una volontà ottenere 4-byte di memoria, proprio come una variabile? (nel sistema a 32 bit)

+0

se è globale e non cambierà mai, dare una mano all'ottimizzatore e renderlo 'static const int a = 5;' –

+0

"' const' "è una parola chiave con connotazioni errate. Non crea un "const" nel significato giorno per giorno: crea un normale oggetto normale che non può essere scritto. Sarei più felice se la parola chiave per il concetto fosse "readonly" quando è stata introdotta nella lingua _no, non penso sarebbe bello cambiarla ** now ** _ – pmg

+0

Odd. Non ho usato C/C++ da molto tempo (.Net ora), ma pensavo che 'const int' fosse un'aggiunta al C++, e tu avevi bisogno di' # define' in C. –

risposta

-1

Dipende dal compilatore.

Ad esempio:

const int a = 4; 

Questo potrebbe essere gestita dal compilatore assegnando 4 byte e solo applicare immutabilità.

Se tu avessi una stringa costante:

static final java.lang.String name = "Foobar"; 

Il compilatore potrebbe rimuovere la variabile e sostituirlo con la stringa effettiva "Foobar" in tutto il mondo viene utilizzata la variabile. Questo non occupa spazio dall'heap ma deve ancora essere memorizzato da qualche parte nel segmento dei dati del programma. Java prova a farlo quando trova una stringa quotata che viene utilizzata in più punti, quindi deve solo memorizzarne una copia.

In entrambi i casi, le costanti non eliminano l'allocazione di memoria. Nella migliore delle ipotesi possono solo ridurre al minimo lo spazio di archiviazione necessario.

+0

Penso anche che dipenda dal compilatore – root

1

Dipende dalla tua architettura ma sì, se si crea qualcosa const o no, non influisce in realtà sulle sue dimensioni ma sulla sua posizione in memoria. Ora, ci sono alcune ottimizzazioni del compilatore che potrebbero cambiare ciò che pensate possa realmente accadere, ma questa è l'idea di base.

13

Sì, lo farà. Anche se non si prende mai l'indirizzo, l'ottimizzatore potrebbe rimuoverlo completamente e sostituire solo i riferimenti alla costante con il numero 5 nel tuo caso.

+12

Gli oggetti costanti in C hanno un collegamento esterno per impostazione predefinita. Ecco perché è difficile per l'ottimizzatore rimuoverli: devono essere esportati dal file oggetto. Solo un ottimizzatore globale più avanzato può farlo, quindi non sorprenderti se non viene rimosso. In C, se vuoi una costante "rimovibile" devi dichiararla 'static' esplicitamente. – AnT

+0

Ciò significa che il compilatore molto probabilmente * sostituirà * tutti i riferimenti alla costante con letterale '5', ma ancora non ha alcuna libertà immediata di rimuovere l'oggetto costante originale dalla memoria (a meno che non abbia modo di sapere che è effettivamente mai fatto riferimento in nessun punto del programma). – AnT

+0

mentre viene rimosso dallo stack e dall'heap sarà presente nel codice assembly (una o più volte) se non è stato mixato in fase di compilazione con un'altra costante. –

0

Potrebbe richiedere la quantità normale, ma se lo si utilizza solo in modi che non richiedono mai di avere un indirizzo, il compilatore/linker può ottimizzarlo via in modo che non occupi alcun tipo di memoria.

0

Generalmente la costante occupa lo stesso spazio di una variabile, quindi se int è a 32 bit sulla tua architettura, a prenderà anche 32 bit. Tuttavia, il compilatore potrebbe anche decidere di inserire direttamente la costante nel codice, senza assegnare spazio per la costante stessa. Questo dipenderà dal punto in cui la costante viene effettivamente definita, ovvero se il compilatore è in grado di determinare che non vi è alcuna possibilità di modificare una (ad esempio tramite i cast cost) o di prendere l'indirizzo di a.

3

Dipende.

const int a = 5; 

Richiede quattro byte di memoria (o comunque molti byte che un int occupa sul sistema).

Se si rendono statica:

static const int a = 5; 

Poi l'ottimizzatore è libero di sostituire ogni istanza del a con il valore di 5.L'ottimizzatore non può fare che nel primo caso (non statico) semplicemente perché si può fare riferimento alla a in un'unità di compilazione separata con:

extern const int a; 
-1

Su un sistema embedded, dove memoria di sola lettura è separata dalla memoria scrivibile , questa costante non occuperà RAM, sarà memorizzata solo nella ROM. Allo stesso modo, su un sistema con memoria virtuale, le costanti verranno caricate in pagine di memoria di sola lettura e occuperanno solo la RAM una volta, indipendentemente dal numero di copie in esecuzione del programma.

1

Non c'è differenza nel consumo di memoria tra int a e const int a.

Nota, tuttavia, che in oggetti C dichiarati come const non si formano espressioni costanti (al contrario di C++) e il collegamento esterno è predefinito (diversamente da C++, di nuovo). Tutto ciò significa che in C un oggetto costante è praticamente la stessa cosa di un oggetto non costante, solo non modificabile.

Inoltre, significa che in C un oggetto costante ha pochissime possibilità di essere "rimosso", come altre risposte affermano che lo farà. Se vuoi davvero renderlo "rimovibile" in C, devi dichiararlo come static in modo esplicito. Ma anche questo non renderà un oggetto const int la forma di espressioni costanti, cioè non è ancora possibile utilizzarlo per designare la dimensione dell'array in C89/90 e in C99 l'array risultante è ancora un array a lunghezza variabile (VLA).

0

una variabile costante richiede 4 byte di memoria, ma se è un valore che richiede 0 byte Poiché il codice assembly verrà embbed il valore simili

mov eax, 5

qui 5 tiratevi viene da una variabile ma è la costante 5, e genererà anche codice più veloce poiché non è richiesta alcuna chiamata di memoria per recuperare il valore, è solo parte del codice assembly

Problemi correlati