wie kann man zwei buffer speichersparend zusammenfügen?
-
earli schrieb:
for (int i = 0; i < SIZE1+SIZE2; i++) { do_stuff(i < SIZE1 ? buf1[i] : buf2[i-SIZE1]); }
wenn du weißt wie es geht, dann post doch bitte nicht sowas!
-
Fragesteller0815 schrieb:
Ich muss umkopieren weil der ganze Buffer (buf1+buf2) an eine Funktion übergeben werden, die prüft ob genug ram übrig ist um den buffer weiter zu verarbeiten.
Wenn ich aber zuerst buffer1 und dann erst buffer2 übergeben dann kommt natürlich ein blödsinn raus, weil es passieren kann das genug platz für buffer1 ist, aber nicht mehr für buffer2.Was kannst Du denn Deiner Pufferüberprüfungsfunktion übergeben und was liefert die zurück?
-
Die Funktion sieht so aus:
bool sendMsg(const char *toSend, const int len)
und die liefert ebenfalse
zurück wenn nicht genug speicher da is.
-
Konntest du das Problem inzwischen lösen?
-
Fragesteller0815 schrieb:
Ich bin im moment vor einem Problem.
Ich habe zwei Bufferchar buf1[100]
undchar buf2[ca. 921600]
, und möchte diese so zusammenfügen, dass am Ende vonbuf1 buf2
steht. Ich könnte zwar eine temporäres Array mit den addierten größen erstellen, allerdings kommt mir das weder schnell noch platzsparend vor.
Gibt es eine Möglichkeit das elegant zu lösen?Ja, Du benutzt einfach von vorn herein nur einen Puffer und machst es so:
char gesamt[100+921600]; char *buff1 = gesamt; char *buff2 = gesamt + 100;
Damit liegen beide Speicherbereiche direkt hintereinander. Du brauchst nichts zu kopieren und verschwendest keinen Speicher.
Überall wo Du bisher buff1 und buff2 benutzt hast, nimmst Du nun die Pointer.
-
Das ist etwas off-topic, aber eigentlich ist dein Projekt schon irgendwie verkorkst, dass es überhaupt 1-Mio-elementige Arrays gibt. Ihr solltet euch vielleicht eine andere Repräsentation der Daten überlegen.
-
earli schrieb:
Das ist etwas off-topic, aber eigentlich ist dein Projekt schon irgendwie verkorkst, dass es überhaupt 1-Mio-elementige Arrays gibt. Ihr solltet euch vielleicht eine andere Repräsentation der Daten überlegen.
das ist nicht nur off-topic, sondern auch eine haltlose vermutung, woher willst du wissen mit was für daten die jonglieren müssen?
auch hier im forum gilt der grundsatz „in dubio pro reo“
lg lolo
-
noobLolo schrieb:
earli schrieb:
Das ist etwas off-topic, aber eigentlich ist dein Projekt schon irgendwie verkorkst, dass es überhaupt 1-Mio-elementige Arrays gibt. Ihr solltet euch vielleicht eine andere Repräsentation der Daten überlegen.
das ist nicht nur off-topic, sondern auch eine haltlose vermutung, woher willst du wissen mit was für daten die jonglieren müssen?
auch hier im forum gilt der grundsatz „in dubio pro reo“
lg lolo
Ich hab zwar nicht explizit gefragt, aber eigentlich ging es um "Erfahren und Helfen".
Auf jeden Fall gibt es in dem Beispiel char-Arrays mit 100+921600 Elementen.
-
sind das schon GB oder noch MB
-
Ich hab das Problem mehr oder weniger gelöst.
Ich konnte den großen Buffer verkleinern (jpeg-Kompression (640*480*3=921600)) auf ca 25000. das kopieren in einen 3ten buffer (größe von 1+2) blieb mir aber dennoch nicht erspart.
LG
-
JPEG kann doch nur mehr Aufwand kosten als reines kopieren.
-
Das schon, aber letzten Endes verringert sich der Aufwand, da die Daten übers Netzwerk versendet werden.
Aber der Zweck meiner Frage war ja nur ob es eine Möglichkeit der schnellen und speichersparenden Zusammenfügung von Buffern gibt - und das wurde beantwortet.
-
pointercrash() schrieb:
kimmi schrieb:
Meines Wissens nach kann realloc Speicherbereiche nicht direkt vergrößern. Intern legt auch er einen größeren Buffer an und kopiert den alten Inhalt in den neuen Buffer.
Darauf läuft's zwar meistens hinaus, heißt aber nicht, daß realloc das nicht kann. realloc() prüft meist, ob der direkt angrenzende Heapblock ausreichend für die anstehende Vergrößerung ist und verzichtet im Positiv- Fall auf das Umkopieren. Wer gesicherte Timings braucht, sollte aber auf realloc verzichten, weil's mal so, mal so kommt.
Wieder was gelernt, das war mir noch nicht bewußt.
Gruß Kimmi