std::memcpy
| 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
- Erstellt implizit Objekte an dest.
- 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
- dest oder src ist ein Nullzeiger oder ein ungültiger Zeiger.
- Das Kopieren erfolgt zwischen sich überlappenden Objekten.
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) | |
| füllt einen Puffer mit einem Zeichen (Funktion) | |
| kopiert eine bestimmte Anzahl breiter Zeichen zwischen zwei nicht überlappenden Arrays (Funktion) | |
| kopiert Zeichen (öffentliche Memberfunktion von std::basic_string<CharT,Traits,Allocator>) | |
| (C++11) |
Kopiert einen Elementbereich an einen neuen Speicherort (Funktionstempelat) |
| Kopiert einen Elementbereich in umgekehrter Reihenfolge (Funktionstempelat) | |
| (C++11) |
prüft, ob ein Typ trivial kopierbar ist (Klassenvorlage) |
| C-Dokumentation für memcpy
| |