std:: memcpy
|
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:
- Erstellt implizit Objekte bei dest .
- 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:
- dest oder src ist ein Nullzeiger oder ungültiger Zeiger .
- Das Kopieren findet zwischen Objekten statt, die sich überlappen.
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>
)
|
|
|
(C++11)
|
kopiert einen Elementbereich an einen neuen Speicherort
(Funktionstemplate) |
|
kopiert einen Elementbereich in umgekehrter Reihenfolge
(Funktionstemplate) |
|
|
(C++11)
|
prüft, ob ein Typ trivial kopierbar ist
(Klassentemplate) |
|
C-Dokumentation
für
memcpy
|
|