Warum sollte das Verhalten von std :: memcpy für Objekte undefiniert sein, die nicht trivial kopiert werden?C++

Programme in C++. Entwicklerforum
Anonymous
 Warum sollte das Verhalten von std :: memcpy für Objekte undefiniert sein, die nicht trivial kopiert werden?

Post by Anonymous »

von http://en.cppreference.com/w/cpp/string/byte/memcpy:


Wenn die Objekte nicht triviellkopisch sind (z. B. Scalars, Arrays, c-compatible Strukturen), ist das Verhalten nicht uneffizient. />
Bei meiner Arbeit haben wir seit langem STD :: memcpy < /code> bis bitgewise Swap -Objekte verwendet, die unter: < /p>

nicht trivial kopiert werden können

Code: Select all

void swapMemory(Entity* ePtr1, Entity* ePtr2)
{
static const int size = sizeof(Entity);
char swapBuffer[size];

memcpy(swapBuffer, ePtr1, size);
memcpy(ePtr1, ePtr2, size);
memcpy(ePtr2, swapBuffer, size);
}
< /code>

und hatte nie Probleme. Meine Frage jedoch: < /p>

Warum sollte das Verhalten von std :: memcpy < /code> selbst nicht definiert werden, wenn sie mit nicht trivial kopischen Objekten verwendet werden? Warum hält der Standard für notwendig, dies zu spezifizieren? The current description says:


If the objects are not TriviallyCopyable (e.g. scalars, arrays, C-compatible structs), the behavior is undefined unless the program does not depend on the effects of the destructor of the target object (which is not run by memcpy
) and the lifetime of the target object (which is ended, but not started durch memcpy < /code>) wird auf andere Weise gestartet, wie z. Nachgeschaltet macht es das gesamte Programm undefiniert. Aber ich bin damit einverstanden, dass es möglich zu sein scheint, in diesem Fall um UB umzukürfen und die Cppreferenz entsprechend zu modifizieren.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post