Cioè dipende da sistema operativo e configurazione. Sui sistemi a 64 bit è più facile che finisca per prima la memoria virtuale (RAM+paging), sui sistemi a 32 bit attuali in genere finisce prima lo spazio di indirizzi virtuale, che è di 2 GB per Windows (3 usando un particolare switch per il kernel), e in genere 3 GB per Linux a 32 bit. In genere poi non sarà comunque possibile fare singole allocazioni così grosse perché lo spazio di indirizzi è in parte frammentato.Originariamente inviato da menphisx
Cioè 4GB ? O_O
Come ho scritto qui, è strettamente necessaria:Spesso mi chiedo veramente a cosa serva l'allocazione dinamica, solo a quello ?
Oltre a allocare risorse di memoria indefinita e a poterla manipolare a piacimento, tipo aggiungere o togliere memoria, però poi oltre a quello, a che serve ?
E' da un po' che me lo chiedo.![]()
- quando non è noto a compile-time quanti oggetti di un certo tipo sono necessari (ad esempio gli elementi delle liste linkate);
- quando servono strutture dati di dimensioni note solo a compile-time (ad esempio stringhe basate su input arbitrario);
- quando la dimensione di una struttura dati è nota al momento della compilazione, ma è troppo grande per lo stack e non avrebbe senso renderla globale (ad esempio grossi vettori da manipolare); nota tra l'altro che tutte le variabili globali in genere vengono mappate 1:1 in una sezione dell'eseguibile, per cui creare un vettore globale di 1 MB farà crescere le dimensioni dell'eseguibile finale di 1 MB;
- last but not least, quando è necessario avere un oggetto la cui durata di vita è diversa da quanto previsto per le variabili automatiche, che sono legate allo scope in cui sono dichiarate (=>sono distrutte quando l'esecuzione esce dal loro scope); ad esempio, dati che sono condivisi tra oggetti con durate di vita differenti e cancellati quando non vengono più usati.
Non è completamente impossibile cavarsela senza allocazione dinamica (molti progetti per microcontrollori sono fatti senza), ma ci sono dei casi in cui di fatto la si deve emulare usando grossi buffer statici e scrivendosi un allocatore.

Rispondi quotando