Namensräume
Varianten
Aktionen

std::memcpy

Von cppreference.com
< cpp‎ | string‎ | byte
 
 
 
 
Definiert in 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 an dest.
  2. Kopiert count Zeichen (als ob sie vom Typ unsigned char wären) aus dem Objekt, auf das von src gezeigt wird, in das Objekt, auf das von dest gezeigt wird.

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

Inhalt

[bearbeiten] Parameter

dest - Zeiger auf die Speicherstelle, zu der kopiert werden soll
src - Zeiger auf die Speicherstelle, von der kopiert werden soll
zählt - Anzahl der zu kopierenden Bytes

[bearbeiten] Rückgabewert

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

[bearbeiten] Hinweise

std::memcpy ist die schnellste Routinenbibliothek für das Kopieren von Speicher zu Speicher. Sie ist in der Regel effizienter als std::strcpy, das die kopierten Daten scannen muss, oder std::memmove, das Vorsichtsmaßnahmen treffen muss, um überlappende Eingaben zu behandeln.

Mehrere C++-Compiler wandeln geeignete Schleifen zum Kopieren von Speicher in std::memcpy-Aufrufe um.

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

[bearbeiten] Beispiel

#include <cstdint>
#include <cstring>
#include <iostream>
 
int main()
{
    // simple usage
    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";
 
    // reinterpreting
    double d = 0.1;
//  std::int64_t n = *reinterpret_cast<std::int64_t*>(&d); // aliasing violation
    std::int64_t n;
    std::memcpy(&n, &d, sizeof d); // OK
 
    std::cout << std::hexfloat << d << " is " << std::hex << n
              << " as a std::int64_t\n" << std::dec;
 
    // object creation in destination buffer
    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 is 3fb999999999999a as a std::int64_t
{42}

[bearbeiten] 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 erstelltes Objekt zeigt wurde klargestellt

[bearbeiten] Siehe auch

verschiebt einen Puffer in einen anderen
(Funktion) [bearbeiten]
füllt einen Puffer mit einem Zeichen
(Funktion) [bearbeiten]
kopiert eine bestimmte Anzahl breiter Zeichen zwischen zwei nicht überlappenden Arrays
(Funktion) [bearbeiten]
kopiert Zeichen
(öffentliche Memberfunktion von std::basic_string<CharT,Traits,Allocator>) [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 memcpy