Warum sollte das Verhalten von std :: memcpy für Objekte undefiniert sein, die nicht trivial kopiert werden?
Posted: 13 Apr 2025, 00:22
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) 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.
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