Forse non riesco a spiegarmi.
In Java indicare un campo o un metodo static vuol dire che e' un campo/metodo di classe e non di istanza
Per quello ho scritto statico e non static!
un oggetto static e' un oggetto globale, quindi allocato nell'area di memoria degli oggetti globali.
La memoria è suddivisa in due parti:
Stack
Heap
Non esiste una memoria globale,ma esisterà una memoria gestita dalla vm come area di memoria globale!
Il perche' allocare tutto nello heap? Banale: uniformita' di implementazione, minor complessita' nella progettazione del garbage collector.
Il Garbage Collector serve proprio per gestire la memoria dell'heap e basta,non esiste un Garbage Collector per lo stack,lo stack è gia gestito dalla cpu!!!!
L'esempio fatto in C e' fuorviante: tu hai mostrato come sfruttare le routine di allocazione della memoria per implementare un vettore dinamico. Purtoppo questo approccio non funziona. Ad esempio una volta reallocato, da nessuna parte c'e' scritto quanti elementi contiene (o puo' contenere al massimo).
Si vede che sei agli inizii.
Cosa vuol dire che da nessuna parte c'è scritto quanti elementi contiene?l'ho poi scritto?
Racchiudere il tutto in una struttura o classe è solo una semplificazione del programmatore ma non serve a niente per il codice:
Esistono infinite tecniche per estrarre la dimensione del vettore.
Ecco un esempio di un vettore di char dinamico,praticamente l'uso di strighe in c senza il terminatore '\0',come noterai non serve assolutamente a niente creare strutture o diavolerie simili!
void whyprint(int* vect,int count)
{
int i = 0;
for (i = 0; i < count ; i++)
printf("%c",vect[i]);
}
int main()
{
int* vect = NULL;
int count = 0;
char c;
while ( (c=getchar()) != '\n' && c != EOF )
{
if (vect == NULL)
vect = malloc(++count);
else
vect = realloc(vect,++count);
vect[count-1] = c;
}
whyprint(vect,count);
return 0;
}
Dire che Java non puo' allocare oggetti nello stack, e' altrettanto fuorviante: lo stack in Java e' usato come in tutti i linguaggi: i tipi primitivi ed i reference (i puntatori) sono allocati sullo stack.
Assolutamente falso,c++ crea oggetti anche nello stack:
oggetto sobj; //creato oggetto di nome sobj nello stack
oggetto* dobj = new oggetto(); // creo oggetto nell'heap di nome dobj