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.
Né a
né b
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).