memcpy für überlappende Speicherbereiche?

OP #2015994
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
#2016034
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
Gast #2016044
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.
#2016063
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
#2016142
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.
Gast #2016191
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.
OP #2016205
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
#2016254
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.
OP #2016285
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren