Frage

memmove nicht wirklich Speicher bewegen, ist nicht richtig? Es ist einfach Kopien Speicher von einer Region zur anderen und ermöglicht es, diese beiden Bereiche überlappen. Ich stelle diese Frage, weil ich möchte nur wissen, warum diese FNC in sehr irreführend Weise genannt werden.
Denn ich verstehe, dass, wenn etwas von einem Ort zum anderen bewegt, die „Dingens“ nach dieser Operation in der anderen Ort und nicht in der ersten. Und mit memmove funktioniert es nicht so. Bin ich richtig?

War es hilfreich?

Lösung

Sie haben Recht, es kopiert. Allerdings gibt es einen Unterschied zwischen memmove und memcpy, weil memmove richtig, den Fall behandeln, wenn die Puffer überlappen, so dass es in diesen Fällen empfohlen wird.

Da jedoch zusätzliche Kontrollen, dass memmove führt, wenn die Puffer klein sind, und zwar sicherlich nicht überlappen, memcpy ist besser.

Andere Tipps

Der Unterschied zwischen memcpy() und memmove() ist, dass memmove() immer sicher ist, zu verwenden, unabhängig davon, zwischen Quell- und Ziel-Aliasing. Es ist, als ob memmove() kopiert Daten in einen temporären Puffer und dann zum Ziel. memcpy() bietet keine Aliasing-Garantien. es können Arbeit als gedacht, aber vielleicht auch nicht. Wenn Sie Puffer wissen nicht überlappen können, ist memcpy() in Ordnung, und in jeder gegebenen Bibliothek Verwendung Optimierungen können, die es ermöglichen, schneller zu sein als memmove(). In einer anderen Bibliothek memcpy() kann tatsächlich nur memmove().

Wenn Sie src und dst nicht wissen können, Aliase sein, ist es sicher memcpy() zu verwenden. Wenn Sie nicht wissen, was man auf Sie zutrifft, Verwendung memmove().

Die Funktion wird als solche bezeichnet, weil , wenn die Speicherbereiche kopiert tun passieren zu überlappen, ist es nicht mehr eine Kopie, da der ursprüngliche Puffer nicht mehr unverändert ist. Daher sollte der ursprüngliche Puffer unbrauchbar angesehen werden. Da Sie mit memmove nicht MEMCPY dies wahrscheinlich der Fall sein soll. Deshalb ist die Namensgebung Sinn macht. Semantisch Sie zum Verschieben von Daten nicht kopieren

memmove Kopien Daten von der Quelle zum Ziel. Es unterscheidet sich von Memcpy , dass sie auf überlappende Speicherbereiche zur Arbeit gewährleistet ist.

Ja, memmove wirklich mit der Fähigkeit memcpy überlappende Blöcke zu handhaben. Angenommen, Sie haben ein Array haben, und Sie wollen einige neue Elemente am Anfang einfügen (oder einige Elemente entfernen), dann symantically, was Sie tun, ist „bewegt“ die (bestehende oder noch) Gegenstände zurück und her - ich denke, und in diesem Zusammenhang macht der Name Sinn.

Ja, memmove ist eine weitere Variante der Kopie. Es ist nicht „bewegen“ Speicher in dem Sinne, dass das ursprüngliche Bytes nicht mehr, was sie vor der Operation waren. Es ist speziell den Fall überlappten Speicher zu behandeln.

Wie dies geschehen ist, hängt von Ihrer Architektur, aber ich habe es verschiedene Arten geschehen zwei gesehen:

  • verwenden, um einen temporären Puffer mit zwei Memcpy-Typ-Operationen; oder
  • Kopieren von dem ersten Byte geht vorwärts oder das letzte Byte rückwärts gehen, abhängig von der Falzung (falls vorhanden).

Ihre Frage zu memmove() Namen zu beantworten: Ich denke, der Name Unterstützung widerspiegeln sollte für Bereiche der Elemente in einem Array in einem anderen Bereich in dem Array (zum Beispiel bewegen, um Platz zu schaffen für ein neues Element am Anfang oder innerhalb das Array).

Wie andere Antworten erwähnen, memcpy() können Optimierungen Techniken verwenden, die nicht zur Verfügung memmove() sind, weil memcpy() Speicherbereiche nicht, dass Überlappung unterstützen, während memmove() tut.

Eine Sache, Sie vielleicht zu prüfen, ist noch memmove() zu verwenden, anstatt memcpy() standardmäßig, wenn Sie an einer Anwendung arbeiten, wo Kopierleistung kritisch ist. memcpy() kann bessere Leistung (vor allem, weil es effektiver inlined kann, glaube ich), aber bedenken Sie dieses Zitat über die memcpy() Implementierung im Linux-Kernel von einer Diskussion über unsachgemäßen Gebrauch der Anwendung der C Bibliothek memcpy():

Im Kernel die optimierten x86 MEMCPY wir verwenden, sind eigentlich ein memmove (), weil während der Leistung wirklich wichtig ist, so Wiederholbarkeit und die Vermeidung von Überraschungen (streng genommen, haben wir zwei: die „rep movs“ -Version für den Fall, wo das sollte schnell sein, und die Open-codierte Kopie-Version. die „rep movs“ -Version ist nach vorne geschützt und behandelt nicht überlappende Bereiche).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top