speicher reservierung mit pointern
-
hi,
wenn ich speicher mithilfe eines pointers reserviere mittyp* pointer; pointer = new typ [n]wird dann nach einer adresse gesucht die n freie speicherplätze der größe typ direkt nach sich hat und diese speicherplätze werden reserviert oder baut sich alles direkt übereinander auf?
wenn sich alles direkt nacheinander aufbaut kann es ja durch späteres freigeben von speicher durch delete oder casts oder ähnliches zu größeren lücken kommen die wieder aufgefüllt werden sollten um den speicher effektiv zu nutzen. kann man den speicher dann irgendwie zusammenschieben oder in folgendem beispiel z.b. etwas der größe 2 in -- packen statt nach dem xxx?
xxxx--xxx------------ (x = nicht verfügbar, - = verfügbar)und ist es möglich/sinnvoll einen teil der reservierung die man nicht mehr braucht freizugeben aber nicht alles? (ohne eine komplett neue adresse zu bekommen und alles kopieren zu müssen).
Ich habe schon ausprobiert
pointer = new int [a]; //... beschreiben ... pointer = new int [a-b]; //... auslesen ...edit: das hat nicht funktioniert wie ich es mir vorstellte ^^
und z.b. *(pointer[a-2])=5; gab error, war also anscheinend noch reserviert.
-
Halozination schrieb:
pointer = new int [a]; //... beschreiben ... pointer = new int [a-b] //... auslesen ...sollte heissen
pointer = new int[a]; //... beschreiben ... int* temp = new int[a - b]; for(unsigned c = 0; c < a - b; c++) temp[c] = pointer[c]; delete[] pointer; pointer = temp; temp = nullptr; //... auslesen ...
-
EOutOfResources schrieb:
Halozination schrieb:
pointer = new int [a]; //... beschreiben ... pointer = new int [a-b] //... auslesen ...sollte heissen
pointer = new int[a]; //... beschreiben ... int* temp = new int[a - b]; for(unsigned c = 0; c < a - b; c++) temp[c] = pointer[c]; delete[] pointer; pointer = temp; temp = nullptr; //... auslesen ...(ohne eine komplett neue adresse zu bekommen und alles kopieren zu müssen).
-
Halozination schrieb:
ohne eine komplett neue adresse zu bekommen und alles kopieren zu müssen
Aha, nein. Ich lese eigentlich keinen Text, dessen Autor die deutsche Sprache nicht umsetzt.
-
Wie genau die Speicherverwaltung arbeitet, ist nicht festgelegt. Aber ich würde schon davon ausgehen, daß sie sich bemüht, unnötige Speicher-Fragmentierung zu vermeiden. Zusammenschieben kann sie die Speicherbereiche allerdings nicht, schließlich müssen die einmal reservierten Speicherbereiche weiterhin erreichbar bleiben, bis sie wieder freigegeben werden.
-
Halozination schrieb:
hi,
wenn ich speicher mithilfe eines pointers reserviere mittyp* pointer; pointer = new typ [n]wird dann nach einer adresse gesucht die n freie speicherplätze der größe typ direkt nach sich hat und diese speicherplätze werden reserviert oder baut sich alles direkt übereinander auf?
wenn sich alles direkt nacheinander aufbaut kann es ja durch späteres freigeben von speicher durch delete oder casts oder ähnliches zu größeren lücken kommen die wieder aufgefüllt werden sollten um den speicher effektiv zu nutzen.
Das ist zwar strenggenommen plattformabhängig, aber ja: So wird das in der Regel gemacht und der Effekt den du beschreibst kann dann auch auftreten.
kann man den speicher dann irgendwie zusammenschieben oder in folgendem beispiel z.b. etwas der größe 2 in -- packen statt nach dem xxx?
xxxx--xxx------------ (x = nicht verfügbar, - = verfügbar)und ist es möglich/sinnvoll einen teil der reservierung die man nicht mehr braucht freizugeben aber nicht alles? (ohne eine komplett neue adresse zu bekommen und alles kopieren zu müssen).
Ich habe schon ausprobiert
pointer = new int [a]; //... beschreiben ... pointer = new int [a-b]; //... auslesen ...edit: das hat nicht funktioniert wie ich es mir vorstellte ^^
und z.b. *(pointer[a-2])=5; gab error, war also anscheinend noch reserviert.Die übliche Vorgehensweise wenn man solche Probleme hat und man meint, diese durch Nutzung von Zusatzinformation über das Programmverhalten umgehen zu können, ist das Schreiben eines eigenen Speichermanagers. Dieser wird dann üblicherweise erst einmal einen ausreichend großen Block Speicher auf "normale" Weise für seine Zwecke anfordern (oder je nach Bedarf mehr) und dann kann dein Programm sich an diesen Speichermanager wenden und dieser führt dann solche optimierten Speicheranforderungen aus.
Es gibt dafür sicherlich auch schon fertige Lösungen, weil Speicherfragmentierung durchaus ein Problem sein kann bei lang laufenden Servern. Es gibt soweit ich weiß auch Schlater, mit denen man die Allokationsstrategie des Betriebssystems anpassen kann, so dass man eventuell gar nicht die Indirektion über den eigenen Allokator benötigt. Wie genau, ist natürlich plattformabhängig.