Namensräume
Varianten
Aktionen

std::memmove

Von cppreference.com
< cpp‎ | string‎ | byte
 
 
 
 
Definiert in Header <cstring>
void* memmove( void* dest, const void* src, std::size_t count );

Führt die folgenden Operationen in der angegebenen Reihenfolge aus

  1. Erzeugt implizit Objekte an dest.
  2. Kopiert count Zeichen (als ob vom Typ unsigned char, unten ebenfalls) aus dem Objekt, auf das src zeigt, in ein temporäres Array arr von count Zeichen, wobei arr nicht mit den Objekten überlappt, auf die dest und src zeigen.
  3. Kopiert count Zeichen aus arr in das Objekt, auf das dest zeigt.

Wenn dest oder src ein Nullzeiger oder ein ungültiger Zeiger ist, ist das Verhalten undefiniert.

Inhalt

[edit] Parameter

dest - Zeiger auf den Speicherort, zu dem kopiert werden soll
src - Zeiger auf den Speicherort, von dem kopiert werden soll
zählt - Anzahl der zu kopierenden Bytes

[edit] Rückgabewert

Wenn ein geeignetes erzeugtes Objekt vorhanden ist, wird ein Zeiger darauf zurückgegeben; andernfalls wird dest zurückgegeben.

[edit] Hinweise

Obwohl die Spezifikation besagt, dass ein temporärer Puffer verwendet wird, verursachen tatsächliche Implementierungen dieser Funktion nicht den Overhead von doppeltem Kopieren oder zusätzlichen Speicher. Für kleine count können Register geladen und geschrieben werden; für größere Blöcke ist ein gängiger Ansatz (glibc und bsd libc), Bytes vorwärts vom Anfang des Puffers zu kopieren, wenn das Ziel vor der Quelle beginnt, und rückwärts vom Ende, wenn dies nicht der Fall ist, mit einem Fallback auf std::memcpy, wenn überhaupt keine Überlappung vorliegt.

Wo Strict Aliasing das Betrachten desselben Speichers als Werte zweier verschiedener Typen verbietet, kann std::memmove verwendet werden, um die Werte zu konvertieren.

[edit] Beispiel

#include <cstring>
#include <iostream>
 
int main()
{
    char str[] = "1234567890";
    std::cout << str << '\n';
    std::memmove(str + 4, str + 3, 3); // copies from [4, 5, 6] to [5, 6, 7]
    std::cout << str << '\n';
}

Ausgabe

1234567890
1234456890

[edit] Fehlerberichte

Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
LWG 4064 C++98 Es war unklar, ob der zurückgegebene Zeiger auf ein geeignetes erzeugtes Objekt zeigt wurde klargestellt

[edit] Siehe auch

kopiert einen Puffer in einen anderen
(Funktion) [bearbeiten]
füllt einen Puffer mit einem Zeichen
(Funktion) [bearbeiten]
kopiert eine bestimmte Anzahl breiter Zeichen zwischen zwei, möglicherweise überlappenden, Arrays
(Funktion) [bearbeiten]
Kopiert einen Elementbereich an einen neuen Speicherort
(Funktionstempelat) [edit]
Kopiert einen Elementbereich in umgekehrter Reihenfolge
(Funktionstempelat) [edit]
prüft, ob ein Typ trivial kopierbar ist
(Klassenvorlage) [bearbeiten]
C-Dokumentation für memmove