Ruberò la prima frase dalla risposta di Péter Török ma elaborerò in modo diverso: Non necessariamente. Può anche decidere di utilizzare solo il valore grezzo 5 invece di myval
nel codice compilato.
Trattare myval
come una variabile regolare allocando lo spazio per essa in memoria può avere implicazioni sulle prestazioni che vanno da minuscolo a grave a seconda dell'architettura e di come gestisce la memoria.
Lavorando in questo modo, un compilatore emetterebbe un'istruzione che dice qualcosa sulla falsariga di "load register R con qualunque cosa si trovi nella posizione di memoria per myval
". La posizione di myval
come un operando dell'istruzione, in modo tale che essa esca dallo stesso blocco di dati dell'istruzione stessa. Sulle moderne CPU, questo valore sarà prontamente disponibile on-chip a causa del prefetch delle istruzioni. Con l'indirizzo in mano, la CPU deve ancora estrarre il valore dalla memoria. Potrebbe andare rapidamente se la posizione è nelle vicinanze nella cache o no così rapidamente se non lo è. Non solo la CPU deve andare fuori dal chip per ottenere il valore, così facendo potrebbe costringerlo a scaricare altri dati più utili dalla cache che dovranno essere riportati in seguito. Quando il programma è in esecuzione su un sistema operativo che virtualizza la memoria, l'accesso a tale posizione potrebbe causare un errore di pagina, causando la sospensione del programma fino a quando la pagina richiesta viene portata nella RAM tramite I / O periferici (ad esempio, disco), il programma riavviato tramite un interruttore di contesto e il meccanismo della cache fa tutto ciò che ha intenzione di fare con esso.
Collegando a fondo il valore costante nel codice oggetto, il compilatore emetterebbe un'istruzione come "load register R con il valore 5
." Come l'indirizzo di memoria descritto sopra, il 5
sarebbe un operando dell'istruzione e disponibile allo stesso modo (vale a dire, precaricato). Ecco dove finisce la somiglianza, perché ora la CPU ha tutto il necessario per mettere la 5
nel registro R e andare avanti con la sua attività. Poiché gli indirizzi e i registri di solito hanno le stesse dimensioni, non c'è differenza nel numero di byte occupati dall'istruzione e l'effettiva esecuzione avviene con zero possibilità di errori di cache e di errori di pagina che possono verificarsi quando si pesca qualcosa fuori memoria.
Il compilatore potrebbe, come ha sottolineato Péter, allocare spazio e un simbolo per myval
nei build di debug. Non ci sarebbe nulla di male nel fare ciò e continueremo a collegare il suo valore, dal momento che il valore rimane lo stesso indipendentemente dal fatto che il simbolo sia davvero lì solo per noi umani da usare nel debugging.
Si noti che questo si applica solo ai valori che possono essere memorizzati nei registri, poiché i registri sono interi per natura. Altre costanti finiranno nella memoria.