Muss ich Fälle behandeln, in denen ich tatsächlich nichts zum Verschieben / Kopieren mit memmove()
/ memcpy()
als Randfälle habe?
int numberOfBytes = ...
if( numberOfBytes != 0 ) {
memmove( dest, source, numberOfBytes );
}
oder sollte ich einfach die Funktion aufrufen ohne zu überprüfen
int numberOfBytes = ...
memmove( dest, source, numberOfBytes );
Ist das Einchecken in das frühere Snippet notwendig?
memcpy
Antworten:
Aus dem C99-Standard (7.21.1 / 2):
Die Antwort lautet also nein; Die Prüfung ist nicht erforderlich (oder ja; Sie können Null übergeben).
quelle
n
kann den Wert Null haben". Sie haben Recht, dass Sie keine Nullzeiger übergeben können, aber darum geht es in der Frage nicht.Wie von @You gesagt, gibt der Standard an, dass memcpy und memmove diesen Fall problemlos behandeln sollen. da sie normalerweise irgendwie wie implementiert sind
Sie sollten nicht einmal eine andere Leistungsminderung als den Funktionsaufruf haben. Wenn der Compiler Intrinsics / Inlining für solche Funktionen unterstützt, kann die zusätzliche Überprüfung den Code sogar ein wenig langsamer machen, da die Überprüfung bereits zu diesem Zeitpunkt durchgeführt wird.
quelle