In c / c ++, le variabili a ambito di blocco sono impilate solo se il blocco è eseguito?

7

Supponiamo che:

void func()
{
 ...
 if( blah )
 {
  int x;
 }
 ...
}  

Lo spazio per x è riservato nello stack immediatamente quando viene inserito func o solo se il blocco viene effettivamente eseguito?
O è la scelta del compilatore?
C e C ++ si comportano allo stesso modo?

    
posta Petruza 18.12.2011 - 08:25
fonte

2 risposte

12

Chi ha detto che il compilatore riserverà qualsiasi spazio (potrebbe essere registrato solo).

Questo è completamente indefinito.
Tutto ciò che puoi dire è che ( x ) è accessibile solo dall'interno del blocco interno.

Il modo in cui il compilatore alloca la memoria (su uno stack, se esiste anche) è completamente in cima al compilatore (dato che l'area di memoria può essere riutilizzata per più oggetti (se il compilatore può dimostrare che la loro durata non si sovrappone)).

Is the space for x reserved on the stack immediately when func is entered

Non definito.

or only if the block is actually executed?

Non definito.
Ma se x era un oggetto di classe, il costruttore verrà eseguito solo se viene inserito il blocco.

Or is it the compiler's choice?

Il compilatore non può nemmeno allocare memoria.

Do C and C++ behave the same about this?

Si

    
risposta data 18.12.2011 - 08:45
fonte
4

Beh, in realtà è la scelta del compilatore, ma quello che ho osservato è che quando compile senza ottimizzazioni (che è ciò che facciamo di solito per poter eseguire il debug del nostro codice) il compilatore tende a fare le cose in maniera abbastanza chiara, deterministica e affidabile:

  • Il compilatore non ottimizza le eventuali variabili locali. (Tranne, forse, variabili definite esplicitamente come register , ma deve essere verificato.)

  • Lo spazio di stack per tutte le variabili locali, indipendentemente dal modo in cui sono nidificate, viene riservato in una volta quando viene inserita la funzione.

  • Lo spazio dello stack è non riutilizzato attraverso ambiti nidificati separati. Ciò significa che void f(){ { int x; } { int y; } } alloca lo spazio per due% percentuali diint; lo spazio allocato per x sarà non essere riutilizzato per y .

Naturalmente, se abiliti le ottimizzazioni, tutto ciò che Loki Astari ha scritto nella risposta accettata è vero.

    
risposta data 28.12.2015 - 09:57
fonte

Leggi altre domande sui tag