memmove kann in einen Memcpy umgewandelt werden, wenn sich die beiden Speicherbereiche nicht überschneiden. Offensichtlich ist memcpy auf den meisten Systemen extrem optimiert (eine von denen, die ich verwende, macht fast jeden Trick aus dem Buch von entrollten Schleifen zu SSE-Operationen, wo für maximalen Durchsatz unterstützt wird).
Wenn sich die beiden Speicherbereiche überlappen, wird die zu kopierende Region praktisch in einen temporären Puffer verschoben und der temporäre Puffer wird (höchstwahrscheinlich mit memcpy) wieder über den ursprünglichen Puffer kopiert. Sie können nicht von Anfang an arbeiten oder von hinten mit einer überlappenden Region arbeiten, da Sie dadurch immer mindestens einige Daten verlieren, die dabei beschädigt werden.
Das ist gesagt, es ist eine lange Zeit her, seit ich den libc-Code angeschaut habe, also könnte es eine Optimierung für memmove und überlappende Regionen geben, an die ich noch nicht gedacht habe.
memmove hängt nicht davon ab, wie der Stack überhaupt wächst - er kopiert lediglich einen Speicherbereich an einen anderen Speicherort - genau wie memcpy, außer dass er überlappende Bereiche behandelt und memcpy nicht.
EDIT: Eigentlich darüber etwas mehr denken ... Arbeiten von der Rückseite kann funktionieren, wenn Sie von der richtigen "Quelle" gehen (sozusagen), abhängig von der Bewegung selbst (zB ist Quelle < dest oder nicht?). Sie können die Implementierung von newlib here lesen, und tt ist auch ziemlich gut kommentiert.
Wenn 'src',' dst' und 'sz' alle positive Werte sind, ist die Bedingung unerfüllbar. Wenn 'src> dst' ist, wird das Hinzufügen von positivem' sz' es nicht weniger machen. – Edmund
@Edmund Ich korrigierte – brett