Forum: Compiler & IDEs memcpy für überlappende Speicherbereiche?


von Billy _. (slowflyer)


Lesenswert?

Ich möchte eine soweit wie möglich speicherschonende Möglichkeit 
überlappende Speicherbereiche zu verschieben. Dabei wird immer von 
hinten nach vorne verschoben, sprich:

Speicherzelle: 0123456789...
Wert:          abcdefghij...

nach Verschiebung

Speicherzelle: 0123456789...
Wert:          efghijklmn...

Wie mache ich das jetzt am besten?

1. eigene Kopierroutine schreiben, die das kann
2. verwenden von memcpy (weil nur von hinten nach vorne kopiert wird, 
würde das funktionieren?)
3. verwenden von memmove (benötigt memmove nicht zusätzlichen Speicher 
für eine Zwischenkopie und wäre somit speicherhungriger?)

Ach ja, Controller ist ein AVR32 (32Bit) mit AVR32-Studio

Schon mal Danke für die Hinweise, die da kommen mögen

von (prx) A. K. (prx)


Lesenswert?

William K. schrieb:

> (benötigt memmove nicht zusätzlichen Speicher
> für eine Zwischenkopie und wäre somit speicherhungriger?)

Nein, memmove entscheidet anhand der Art der Überlappung die Richtung, 
in der kopiert wird.

von Volker Z. (vza)


Lesenswert?

Oder ein anderes Konzept.

Irgend wie hört sich dein Thred so an, als ob Du einen Ringpuffer 
verwenden könntest.

Volker

von Billy _. (slowflyer)


Lesenswert?

A. K. schrieb:
> Nein, memmove entscheidet anhand der Art der Überlappung die Richtung,
> in der kopiert wird.

Das würde die Entscheidung erleichtern: memmove

von Billy _. (slowflyer)


Lesenswert?

Volker Zabe schrieb:
> Irgend wie hört sich dein Thred so an, als ob Du einen Ringpuffer
> verwenden könntest.

Ne, kein Ringpuffer, es werden einfach nur Bereiche gelöscht und alles 
was dahinter liegt nach vorne verschoben

von Volker Z. (vza)


Lesenswert?

Also einen halben Ringpuffer (nur den Ausgang)?
Es ist effektiver einen Pointer hoch zusetzen als Speicher zu 
verschieben.
1
char buffer[200];
2
.
3
.
4
memmove(buffer,buffer+5,100);    // Verschieben A
5
.
6
char *ptr=buffer;
7
ptr += 5;                  // "Verschieben" B
8
.
9
.
10
x = buffer[0];    // Zugriff A
11
x = ptr[0]        // Zugriff B

von U.R. Schmitt (Gast)


Lesenswert?

William K. schrieb:
> Ne, kein Ringpuffer, es werden einfach nur Bereiche gelöscht und alles
> was dahinter liegt nach vorne verschoben
Genau das macht ein Ringpuffer auch. Nur ohne irgendwas verschieben zu 
müssen (Ausser den Zeiger auf den Anfang).
Solange immer nur 'vorne' oder 'hinten' gelöscht wird kann das also eine 
sehr effektive Art der Speicherung sein.
Ob Du jetzt ein lineares Array benutzt oder einen Ringpuffer hängt davon 
ab wie oft Du auf einen Wert der nicht am Anfang liegt zugreifst, und 
wie oft etwas gelöscht wird. Bei viel häufigeren Zugriffen auf Werte die 
nicht am Anfang oder Ende stehen, wird die Performance wegen der nötigen 
Adressberechnung mit Prüfung der hinteren Grenze langsamer.

von Peter D. (peda)


Lesenswert?

Ein Ringpuffer hat den Nachteil, daß er mitten im Datenfeld überlaufen 
kann.
Dann guckt z.B. ein strcmp ganz schön blöd aus der Wäsche.
Oder man schreibt sich alle Parserfunktionen selber als Wrap-Around 
fest.

Ein Verschieben des nächsten Records an den Anfang ist also ne clevere 
Idee.


Peter

von Volker Z. (vza)


Lesenswert?

Peter Dannegger schrieb:
> Ein Verschieben des nächsten Records an den Anfang ist also ne clevere
> Idee.

Halte ich in diesem Thred nicht für Richtig.

William schrieb ja, das er nur Entleeren möchte. So kann erstmal kein 
Wrap-Around enstehen.

Er hat auch nichts von Stringverarbeitung geschrieben,das ein Speicher 
ohne Wrap-Around erforderlich macht. Ok, sein Beispiel war mit 
Buchstaben.

Wie meist fehlen noch wichtige Information, um diese Frage 
(Zeiger/Verschiebung?) eindeutig beantworten zu können.

von U.R. Schmitt (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Ein Ringpuffer hat den Nachteil, daß er mitten im Datenfeld überlaufen
> kann.
> Dann guckt z.B. ein strcmp ganz schön blöd aus der Wäsche.

Hmm, Peter weisst Du etwas was ich nicht weiß :-)
ich hatte geschrieben, daß es dann unvorteilhaft wird, wenn man öfter 
auf Daten zugreifen muß, die nicht am Anfang oder Ende stehen.
Wenn Stringfunktionen im Puffer benutzt werden sollen gehts natürlich 
nicht wegen wrap around, dazu müsste man sich den String erst 
rauskopieren.
Aber ich (und Volker wohl auch) hatten etwas die Vermutung, daß das eine 
Art FIFO werden soll, deshalb der Hinweis auf Ringpuffer.

von Billy _. (slowflyer)


Lesenswert?

Ein Ringpuffer nützt mir nichts, da nicht nur am Anfang gelöscht wird, 
sondern auch Teile mittendrin gelöscht bzw. "ausgeschnitten" werden.

>Wie meist fehlen noch wichtige Information, um diese Frage
>(Zeiger/Verschiebung?) eindeutig beantworten zu können.

Siehe meine Eingangsfragen, da wusste ich noch nicht, dass jemand mein 
Konzept in Frage stellt. Fragt und ich antworte, genau so wie ihr 
antwortet, wenn ich frage.

Achso es sind keine Strings

von Karl H. (kbuchegg)


Lesenswert?

William K. schrieb:

> Siehe meine Eingangsfragen, da wusste ich noch nicht, dass jemand mein
> Konzept in Frage stellt.

Es ist sehr oft der Fall, dass es 2 Möglichkeiten gibt

* entweder man beantwortet eine Frage buchstabengemäss.
  Dann hat der Fragesteller seine Antwort

* oder aber man überlegt sich, ob hinter der Frage nicht mehr stecken
  könnte. Ob zb die Frage nur dadurch entsteht, dass ein ungeschicktes
  Konzept angewendet wird.
  In dem Fall ist dem Fragesteller dann oft besser geholfen, wenn man
  ihm zeigt, wo sein Konzept fraglich ist und wie man das besser machen
  kann

Als Analogie:
Wenn die Frage lautet: An welchem Ende greife ich eine Schaufel an?
Dann kann man natürlich sagen: Das Blech kommt nach unten und der Stil 
nach oben.
Man kann natürlich auch (aus dem schmückenden Beiwerk der Frage) 
schliessen, dass er die Baugrube für ein Haus ausheben will. Dann ist 
ihm mit 'Bestell dir einen Bagger' besser geholfen. Nur weil er bisher 
nicht wusste, dass es so etwas wie einen Bagger gibt, muss man ihn ja 
nicht mit einer Schaufel wissentlich wochenlang im Erdreich wühlen 
lassen.


Nun ist es so, dass man in der Informatik Daten nur ungerne im Speicher 
rumkopiert. Wenn irgendmöglich (und natürlich sinnvoll) vermeidet man 
das und sucht sich lieber Organisationsstrukturen bei denen das nicht 
notwendig ist. Von daher war es relativ naheliegend mal nachzufragen, 
was denn die Aufgabe von einer höheren Warte aus gesehen darstellt.

von Billy _. (slowflyer)


Lesenswert?

@Karl heinz Buchegger

Ich versuch mal das Ziel zu umreissen:

Es werden Daten seriell abgeholt und in einen Speicherbereich 
geschrieben. Der User modifiziert die Daten und schickt diese zurück. 
Modifizieren heißt hier unter anderem Löschen und Einfügen von Daten und 
das an beliebiger Stelle.

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.