C'è qualche vantaggio nel definire variabili locali costanti come statiche (c ++)?

5
void Animation::playAnimation() const
{
    static const int index = 0;
    const std::string& animationFileName = 
    m_animationContainer.getAnimationName(index);
    static const int zOrder = -1;
    static bool isLooping = false;

    AnimationBank::play(animationFileName,
                        zOrder,
                        isLooping);
}

C'è qualche vantaggio nel definire le variabili locali costanti come static ? O è inutile e anche una cattiva pratica.

    
posta T M 08.06.2017 - 21:13
fonte

3 risposte

6

Al di là dell'eccellente risposta di @ Christophe, il codice generato per la staticità è molto probabilmente peggiore di quello della variabile locale, quindi se sei interessato al beneficio del sotto-cofano, la statica è peggiore sui processori moderni.

Il motivo è che la statica deve trovarsi da qualche parte nella memoria che può essere trovata da tutti gli altri thread e da tutte le altre chiamate. Questo significa fondamentalmente metterli nella memoria globale.

Nel corso degli anni, processori e amp; i compilatori insieme hanno un accesso significativamente ottimizzato alle variabili locali a causa della popolarità del loro utilizzo, rispetto ad altre variabili, come globals, statica e campi. Il compilatore può scegliere di memorizzare una variabile locale in un registro CPU, e anche se non lo fa (quindi utilizza lo stack di invocazione), tutto lo stack è quasi certamente nella cache. L'accesso allo stack è solitamente una modalità di indirizzamento di spostamento breve (fuori dal registro puntatore dello stack). Tuttavia, l'accesso a globali o statici richiede in genere un offset esteso o un indirizzo assoluto, pertanto le istruzioni risultanti in tal senso sono più lunghe del loro equivalente per l'accesso alla memoria dello stack.

Tutto ciò detto, tuttavia, a causa della combinazione di static e const il compilatore può rilevare che può sostituire il valore costante al punto di utilizzo, quindi forse l'uso di const mitiga quanto sopra. Tuttavia, il tuo frammento mostra almeno una statica non const, quindi forse la discussione è d'attualità.

    
risposta data 09.06.2017 - 00:21
fonte
4

Non è una questione di benefici, ma una questione di semantica:

  • Una variabile statica in una funzione (anche una funzione membro), significa che la variabile è condivisa tra tutte le chiamate di quella funzione. Quindi una chiamata di quella funzione ha un effetto collaterale sulle chiamate successive.

  • Una variabile non statica è univoca per ogni esecuzione della funzione.

Quindi, a meno che non sia richiesto per qualche motivo specifico e ben giustificato, mantenere le variabili locali non statiche.

Nota aggiuntiva: anche la variabile statica è condivisa su thread diversi. Quindi chiamare questa funzione da più di un thread alla volta potrebbe comportare condizioni di gara e UB (anche se chiamati per oggetti diversi).

    
risposta data 08.06.2017 - 21:56
fonte
1

Una variabile locale viene inizializzata o costruita ogni volta che viene chiamata la funzione. Le variabili locali sono memorizzate nello stack e quindi sono generalmente thread-safe.

Una variabile locale statica viene inizializzata o costruita solo una volta; la prima volta che viene chiamata la funzione. Le variabili statiche locali non sono memorizzate nello stack e quindi generalmente non sono thread-safe.

Una variabile locale const è una variabile che non cambia e viene inizializzata o costruita ogni volta che viene chiamata la funzione. Le variabili const locali sono memorizzate nello stack e quindi sono generalmente thread-safe.

Una variabile locale const const è una variabile che non cambia e viene inizializzata o costruita solo una volta; la prima volta che viene chiamata la funzione. Le variabili const statiche locali non sono memorizzate nello stack e quindi generalmente non sono thread-safe.

I compilatori possono essere in grado di ottimizzare le variabili const in una costante di tempo di compilazione.

I compilatori possono essere in grado di ottimizzare le variabili non statiche tenendole nei registri piuttosto che in pila.

    
risposta data 09.06.2017 - 06:46
fonte

Leggi altre domande sui tag