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?
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.
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.
Morin wrote:
> meistens immer?
@Sven: Hier ging es wohl eher um die Formulierung, die augenscheinlich
keinen Sinn ergibt ;)
> @Sven: Hier ging es wohl eher um die Formulierung, die augenscheinlich > keinen Sinn ergibt ;) Genau ;)
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?
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.
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 :)
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...
> 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.
Die Microsoft Compiler emulieren realloc über free und alloc-> kein Vorteil.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.