Inizializzazione dinamica, come funziona?

0

Ho una domanda riguardante l'inizializzazione dinamica.

Codice di esempio

void main()
{
int a = 100;
//Statement1
//Statement2
...
float b = 6.32987; //StatementA
...
return;
}

Il StatementA alloca la memoria nell'esecuzione centrale del programma. Come avviene il processo e dove viene assegnato lo spazio per la variabile b (stack o heap)?

    
posta Rizwan S A 13.01.2014 - 09:28
fonte

2 risposte

2

C non è una lingua interpretata.

Un tipico compilatore C analizzerà il codice sorgente, durante questa analisi troverà tutte le variabili automatiche allocate in una funzione e assegnerà loro una posizione adatta nello stack.

Nel tuo esempio alla variabile viene assegnato un valore iniziale. Il compilatore genererà il codice per inizializzare tutte le variabili di questo tipo ogni volta che viene inserita la funzione, che di solito avviene prima che il codice venga eseguito.

La posizione della definizione nel codice sorgente non ha alcun effetto sul codice che il compilatore genera per riservare la memoria e inizializzare la variabile.

Si noti inoltre che per molti compilatori che utilizzano l'ottimizzazione aggressiva molti dei passaggi sopra descritti saranno ottimizzati al di fuori dell'esistenza. Ad esempio, tutte le variabili inizializzate possono essere raccolte insieme in un blocco e una copia a blocco singolo utilizzata per inizializzarle con una singola istruzione.

    
risposta data 13.01.2014 - 09:43
fonte
0

L'hai taggato come C, ma in un altro commento menzioni C ++ e Java. Cercherò di coprire tutti loro.

C:

Dall'ultimo standard C online :

6.2.4 Storage durations of objects

...

5 An object whose identifier is declared with no linkage and without the storage-class specifier static has automatic storage duration, as do some compound literals. The result of attempting to indirectly access an object with automatic storage duration from a thread other than the one with which the object is associated is implementation-defined.

6 For such an object that does not have a variable length array type, its lifetime extends from entry into the block with which it is associated until execution of that block ends in any way. (Entering an enclosed block or calling a function suspends, but does not end, execution of the current block.) If the block is entered recursively, a new instance of the object is created each time. The initial value of the object is indeterminate. If an initialization is specified for the object, it is performed each time the declaration or compound literal is reached in the execution of the block; otherwise, the value becomes indeterminate each time the declaration is reached.

ab sono dichiarati static , né sono dichiarati con alcun collegamento esplicito, quindi hanno una durata di archiviazione pari a auto ; esistono solo per tutta la durata del loro ambito di applicazione (logicamente parlando). In pratica, lo storage per a e b verrà (di solito) dallo stack di runtime, che verrà (di solito) messo da parte all'ingresso della funzione e (solitamente) rilasciato all'uscita dalla funzione. Tuttavia, questo è un dettaglio di implementazione; finché il comportamento è conforme allo standard, la natura esatta dello storage (stack, heap o altro) non ha molta importanza.

Per quanto riguarda lo storage, non importa quando b è dichiarato all'interno della funzione; dopo che il codice sorgente è stato tradotto in codice macchina, l'archiviazione verrà messa da parte all'ingresso della funzione.

C ++:

Dallo standard C ++ online :

3.7.2 Automatic storage duration [basic.stc.auto]

1 Local objects explicitly declared auto or register or not explicitly declared static or extern have automatic storage duration. The storage for these objects lasts until the block in which they are created exits.

2 [Note: these objects are initialized and destroyed as described in 6.7. — end note ]

3 If a named automatic object has initialization or a destructor with side effects, it shall not be destroyed before the end of its block, nor shall it be eliminated as an optimization even if it appears to be unused, except that a class object or its copy may be eliminated as specified in 12.8.

Per i tipi primitivi, il comportamento è quasi identico a C; l'archiviazione è (di solito) allocata dallo stack di runtime all'ingresso della funzione e (solitamente) rilasciata all'uscita dalla funzione. Per le istanze di tipi di classe, diventa un po 'più complicato.

Java:

Da Sezione 2.6 del Specifica Java Virtual Machine :

2.6. Frames

...

A new frame is created each time a method is invoked. A frame is destroyed when its method invocation completes, whether that completion is normal or abrupt (it throws an uncaught exception). Frames are allocated from the Java Virtual Machine stack (§2.5.2) of the thread creating the frame. Each frame has its own array of local variables (§2.6.1), its own operand stack (§2.6.2), and a reference to the run-time constant pool (§2.5.5) of the class of the current method.

...

2.6.1. Local Variables

Each frame (§2.6) contains an array of variables known as its local variables. The length of the local variable array of a frame is determined at compile-time and supplied in the binary representation of a class or interface along with the code for the method associated with the frame (§4.7.3).

...

In tutti e tre i casi, il comportamento sarà lo stesso (tenendo conto delle differenze nel modo in cui main è definita, lo snippet pubblicato non è corretto al 100% per C, C ++ o Java).

    
risposta data 13.01.2014 - 21:00
fonte

Leggi altre domande sui tag