Code: Select all
mmapstd::memmove
Definiert im Header
void* memmove( void* dest, const void* src, std::size_t count );
Führt die folgenden Vorgänge der Reihe nach aus:
1- Erstellt implizit Objekte am Ziel.
2- Kopiert count-Zeichen (als ob sie vom Typ unsigned char wären, dasselbe unten) aus dem Objekt, auf das src zeigt, in ein temporäres Array arr von count-Zeichen, wobei arr die Objekte, auf die dest und src zeigen, nicht überlappt.
3- Kopiert count-Zeichen von arr in das Objekt, auf das dest zeigt.
(Hervorhebung von mir).
Aber wenn man sich den Standard ansieht, folgt das Verhalten dieser Funktionen dem C-Standard (Abschnitt 7.28.2.3 für std::memmove), der diese Operationssequenz nicht beschreibt (da der Objektbegriff nicht derselbe ist wie in C++):
Beschreibung
Die memmove-Funktion kopiert n Zeichen vom Objekt, auf das s2 zeigt, in das Objekt, auf das s1 zeigt. Das Kopieren erfolgt so, als ob die n Zeichen des Objekts, auf das s2 zeigt, zuerst in ein temporäres Array von n Zeichen kopiert werden, das sich nicht mit den Objekten überschneidet, auf die s1 und s2 zeigen, und dann die n Zeichen aus dem temporären Array in das Objekt kopiert werden, auf das s1 zeigt.
Darüber hinaus erstellen diese Funktionen tatsächlich implizit Objekte an ihrem Ziel (https://eel.is/c++draft/cstring.syn#3).
Ist cppreference also übereifrig und können diese Funktionen legal an „rohem“ Speicherort verwendet werden (wie ich vom C-Standard vermute)? (Randbemerkung: Wie ist der Status eines Speicherorts, der von einer C-API (z. B. mmap) zurückgegeben wird, in C++? (Vielleicht sollte es eine andere Frage sein))
Mobile version