Domanda

Vorrei sapere la differenza tra variabili statiche e variabili globali in termini di velocità di accesso e consumo di spazio . (Se vuoi conoscere la mia piattaforma: compilatore gcc su Windows. (Sto usando Cygwin con Triton IDE per la programmazione ARM7 integrata su Windows. Triton viene fornito con un compilatore gcc su piattaforma Java che può essere eseguito su Windows.))

(Ovviamente lo so in termini di ambito di file e funzioni da questa domanda )

Modifica: OK dammi una risposta su qualsiasi ambiente microcontrollore / processore.

È stato utile?

Soluzione

Non c'è differenza per lo spazio, prendono la stessa quantità.

Ma c'è una differenza di velocità: statica è più veloce.

Ovviamente l'accesso alla memoria per la variabile è globale e statico uguale. Ma il compilatore può ottimizzare quando si ha statico. Quando compila un modulo, sa che nessuna chiamata di funzione a una funzione esterna al modulo può cambiare una variabile statica. Quindi sa esattamente cosa succede e può ad es. tenerlo in un registro sulle chiamate di funzione. Quando è globale e si chiama una funzione da un modulo diverso, il compilatore non può sapere cosa fa. Quindi deve presumere che la funzione acceda alla variabile e la cambi, risultando in un archivio e ricaricandola.

Con gcc puoi passare tutte le fonti .c allo stesso tempo, quindi può anche vedere cosa succede nelle chiamate di funzione a funzioni di moduli diversi. Per farlo funzionare devi passare oltre a tutti i file .c contemporaneamente -combine e -f-whole-program . Il -fwhole-program rende statici tutti i globali (non statico del modulo ma unità di compilazione statica, cioè tutti i file .c forniti insieme). Il -combine effettua l'analisi intermodulo.

Altri suggerimenti

Consumo di spazio: praticamente nessuna differenza. L'unica volta che ci sarebbe un problema di spazio è se riesci a ottenere lo stesso blocco di dati statici nascosto in N file oggetto, quindi ottieni un fattore di moltiplicazione di N dove potresti avere solo 1 copia se fosse un singolo pezzo globale di dati. Tuttavia, questo è un problema di progettazione errata. Nascondere le informazioni è buono - a meno che le informazioni non debbano essere nascoste.

Velocità di accesso: nessuna differenza.

È difficile indovinare o stimare. Probabilmente ci vorrebbe tempo, ma farei un progetto di esempio e testerei la velocità. Testare la velocità di accesso e lo spazio con un loop. Testare il progetto di esempio con un emulatore per quell'architettura.

Mi aspetto che qualsiasi differenza derivi dall'imballaggio (per lo spazio) e dalla memorizzazione nella cache (per la velocità). Entrambi potrebbero anche derivare da qualsiasi altra cosa.

Non c'è nessuna differenza nell'ambiente che descrivi quando si tratta di spazio . La var statica o globale consuma la stessa quantità di memoria.

Per velocità considerazioni ( ma non buone pratiche ) potresti preferire var globali , se hai bisogno di accedere al var al di fuori del file . (fai riferimento a carattere esterno my_global_char_placed_else_where; )

Per una migliore pratica si usano invece le funzioni get / set ma sono più lente. Quindi potresti usare le macro per ottenere / impostare una var che è globale per nascondere al lettore del codice che la var è in realtà globale, ma è un po 'come imbrogliare. Ma può rendere il codice più leggibile.

Se si confronta nascondere una var all'interno di una funzione, allora non ha alcuna differenza rispetto al posizionarla all'esterno della funzione e più funzioni potrebbero avere accesso alla var.

Io stesso utilizzo MSP430, ARM7 (solo per test) e micros AVR32 per lo sviluppo

Ciò che Jonathan dice non è esattamente corretto. Le variabili statiche e globali verranno (devono essere) salvate nelle regioni ZI (o dati RW). Il compilatore non può "mantenere" rigorosamente sul registro - ciò che potrebbe fare è caricare il valore nel registro, utilizzare quel registro per tutte le operazioni e poi salvare quel valore indietro - questa è un'ottimizzazione specifica del compilatore. E anche allora, non c'è motivo per cui il compilatore non lo farà anche per le variabili globali: a meno che ovviamente non lo renda volatile. Ma poi, tecnicamente puoi anche rendere volatile una variabile statica, quindi di nuovo nessuna differenza.

Modifica: oh sì - spazio: nessuna differenza.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top