Namespaces
Variants

std:: memcpy

From cppreference.net
Definiert im Header <cstring>
void * memcpy ( void * dest, const void * src, std:: size_t count ) ;

Führt die folgenden Operationen in der angegebenen Reihenfolge aus:

  1. Erstellt implizit Objekte bei dest .
  2. Kopiert count Zeichen (als ob vom Typ unsigned char ) vom Objekt, auf das src zeigt, in das Objekt, auf das dest zeigt.

Wenn eine der folgenden Bedingungen erfüllt ist, ist das Verhalten undefiniert:

Inhaltsverzeichnis

Parameter

dest - Zeiger auf den Speicherbereich, in den kopiert werden soll
src - Zeiger auf den Speicherbereich, aus dem kopiert werden soll
count - Anzahl der zu kopierenden Bytes

Rückgabewert

Falls ein geeignetes erstelltes Objekt vorhanden ist, gibt es einen Zeiger darauf zurück; andernfalls wird dest zurückgegeben.

Hinweise

std::memcpy ist als schnellste Bibliotheksroutine für Speicher-zu-Speicher-Kopieren konzipiert. Es ist in der Regel effizienter als std::strcpy , das die zu kopierenden Daten scannen muss, oder std::memmove , das Vorkehrungen zur Behandlung überlappender Eingaben treffen muss.

Mehrere C++-Compiler wandeln geeignete Speicherkopierschleifen in std::memcpy Aufrufe um.

Wo strict aliasing die Untersuchung desselben Speichers als Werte von zwei verschiedenen Typen verbietet, kann std::memcpy zur Konvertierung der Werte verwendet werden.

Beispiel

#include <cstdint>
#include <cstring>
#include <iostream>
int main()
{
    // einfache Verwendung
    char source[] = "once upon a daydream...", dest[4];
    std::memcpy(dest, source, sizeof dest);
    std::cout << "dest[4] = {";
    for (int n{}; char c : dest)
        std::cout << (n++ ? ", " : "") << '\'' << c << "'";
    std::cout << "};\n";
    // Neuinterpretation
    double d = 0.1;
//  std::int64_t n = *reinterpret_cast<std::int64_t*>(&d); // Aliasing-Verletzung
    std::int64_t n;
    std::memcpy(&n, &d, sizeof d); // OK
    std::cout << std::hexfloat << d << " ist " << std::hex << n
              << " als std::int64_t\n" << std::dec;
    // Objekterstellung im Zielpuffer
    struct S
    {
        int x{42};
        void print() const { std::cout << '{' << x << "}\n"; }
    } s;
    alignas(S) char buf[sizeof(S)];
    S* ps = new (buf) S; // Placement New
    std::memcpy(ps, &s, sizeof s);
    ps->print();
}

Ausgabe:

dest[4] = {'o', 'n', 'c', 'e'};
0x1.999999999999ap-4 ist 3fb999999999999a als ein std::int64_t
{42}

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 geeignet erstelltes Objekt zeigt klargestellt

Siehe auch

verschiebt einen Puffer in einen anderen
(Funktion)
füllt einen Puffer mit einem Zeichen
(Funktion)
kopiert eine bestimmte Anzahl von Breitzeichen zwischen zwei nicht überlappenden Arrays
(Funktion)
kopiert Zeichen
(öffentliche Elementfunktion von std::basic_string<CharT,Traits,Allocator> )
kopiert einen Elementbereich an einen neuen Speicherort
(Funktionstemplate)
kopiert einen Elementbereich in umgekehrter Reihenfolge
(Funktionstemplate)
prüft, ob ein Typ trivial kopierbar ist
(Klassentemplate)
C-Dokumentation für memcpy