Forum: PC-Programmierung realloc vs free/malloc


von Klaus (Gast)


Lesenswert?

Hallo!

Ist es eigentlich schneller zur Änderung der Größe eines 
Speicherbereichs realloc zu nehmen, anstatt mit malloc neuen speicher 
anzufordern, Inhalt kopieren, und den alten Speicherbereich mit free 
freizugeben?

von yalu (Gast)


Lesenswert?

Realloc versucht, den bestehenden Speicherblock nach hinten zu
vergrößern. Nur wenn dies nicht möglich ist, wird ein neuer
Speicherblock gemalloct, die Daten dort hinein kopiert und der alte
gefreet.

von Sven P. (Gast)


Lesenswert?

Realloc is meistens immer effizienter.

von Morin (Gast)


Lesenswert?

meistens immer?

von Sven P. (Gast)


Lesenswert?

Jo. Bei Reallob besteht die immerhin Chance, einfach das Blockende ein 
Stück nach hinten zu verschieben und so den Block größer zu machen. 
Wenns nicht hinhaut, wird automatisch free+malloc gemacht.

von Simon K. (simon) Benutzerseite


Lesenswert?

Morin wrote:
> meistens immer?

@Sven: Hier ging es wohl eher um die Formulierung, die augenscheinlich 
keinen Sinn ergibt ;)

von Morin (Gast)


Lesenswert?

> @Sven: Hier ging es wohl eher um die Formulierung, die augenscheinlich
> keinen Sinn ergibt ;)

Genau ;)

von Sven P. (Gast)


Lesenswert?

Hab ich schon begriffen ;-)

Dunkel wars, der Mond schien helle...

von Klaus (Gast)


Lesenswert?

Das ganze soll für eine schnelle container Klasse benutzt werden.

Im Moment benutze ich beim ändern Kapazität der Liste malloc um neuen 
Speicher anzufordern, und kopiere dann mit
1
new (adress) T(old_v[i])
die Objekte in den neuen Speicherbereich (T is der Templateparameter. es 
wird also der Copy-Construktor verwendet). Anschließend wird der alte 
mit free gelöscht.

C++ Objekte sollte man ja nicht bitweise mit z. B. memcpy verschieben, 
sondern ebend den Copy-Construktor verwenden. Dieses kopieren versuche 
ich nun zu vermeiden, soweit dies möglich ist.

Gibt es vielleicht eine Möglichkeit, einen Speicherbereich nur zu 
vergrößern, wenn dies ohne verschieben möglich ist?

Könnte ich mich zumindest beim verkleinern mittels realloc darauf 
verlassen, dass der Speicherbereich nicht verschoben wird?

von Klaus (Gast)


Lesenswert?

> ...beim ändern der Kapazität der ...
                 ^^

Ich schmeiße ein 'der' nach...

von I_ H. (i_h)


Lesenswert?

Frage: Wozu brauchst du das? Ist dir der vector in der STL nicht schön 
genug?

Es macht übrigens Sinn vorher schon ein bisschen mehr Speicher zu 
reservieren als du brauchst, spart dir dann einen Haufen reallocs.

von Klaus (Gast)


Lesenswert?

Ich verdopple immer den Speicher, wenn die Kapazität nicht reicht.

Du tuts ja so, als würde ich ein riesen Ding nach programmieren wollen. 
Meine kleine Liste ist mit 50 Zeilen schnell gemacht :)

von Klaus (Gast)


Lesenswert?

dumdidum

von P. S. (Gast)


Lesenswert?

Klaus wrote:
> Ich verdopple immer den Speicher, wenn die Kapazität nicht reicht.

Das ist auch nicht gerade die beste Strategie und fuehrt gerade bei 
Systemen, die viel Spreicher brauchen, schnell in den Abgrund...

von wohoooo (Gast)


Lesenswert?

wohoooo

von tuppes (Gast)


Lesenswert?

> Könnte ich mich zumindest beim verkleinern mittels realloc
> darauf verlassen, dass der Speicherbereich nicht
> verschoben wird?

Nein. Da für die Funktionen der C-Standardbibliothek nur definiert wird, 
WAS sie tun, aber nicht, WIE sie es tun, gibt es darauf keinen Verlass.

von Jorge (Gast)


Lesenswert?

Die Microsoft Compiler emulieren realloc über free und alloc-> kein 
Vorteil.

von I_ H. (i_h)


Lesenswert?

Das hängt nicht vom Compiler, sondern von der libc ab ;).

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.