deckard ha scritto:
+m2+ ha scritto:
Certo che allocare ha un costo.
ma ti sei mai chiesto cosa faccia realloc?
Tutto ha un costo, io mi riferivo in particolar modo alla copia. Realloc suppongo che espanda (minor costo che riallocare ex novo tutta una maggior memoria). Probabilmente, essendo la tua domanda, credo, retorica, suppongo che anch'essa effettui una copia. In effetti ad essa si passa un puntatore. Immagino tuttavia che se riesce ad allocare in modo contiguo la copia non sia necessaria.
Sbaglio di molto?
ti stai avvicinando: nel momento in cui, nello heap, c'è già allocato qualcosa in più, realloc non fa altro che malloc+memcpy.
Solo in certi, rarissimi, casi il sistema operativo supporta la creazione di una paginazione virtuale "figlia", che consente di aumentare lo spazio senza ricopiare.
Mentre, in realtà, ciò è quasi sempre necessario.
"Nel mondo normale", cioè prima di allocare della memoria, bisognerebbe avere un'infarinatura su cosa sia, la memoria, e come venga allocata.
Lo step successivo è di studiare proprio il sorgente di malloc, realloc e così via, in modo da vedere, in concreto, come la "teoria" viene mappata nella realtà.
---
Versione breve: se allochi dinamicamente qualsiasi altra cosa, durante l'esecuzione del programma, realloc non fa miracoli diversi da alloca-e-copia-e-libera.
Questo, sia detto tra di noi, provoca la classica frammentazione interna la quale può, a seconda di quanto è evoluto il sistema operativo, determinare l'esaurimento della RAM disponibile, per il singolo processo, a cagione della parcellizzazione dei blocchi vuoti.
Ciò, normalmente, non accadeva (un tempo), e non accade (oggi) per i processi a 64bit, mentre può accadere, e in generale capita, per quelli a 32 eseguiti WOW