Wie funktioniert die interne Implementierung von memcpy arbeiten?
Wie funktioniert die standard-C-Funktion "memcpy" Arbeit? Es hat für das kopieren einer (großen) portion RAM in einen anderen Bereich im RAM. Da ich weiß, dass Sie sich nicht bewegen kann direkt von RAM zu RAM in der Montage (mit der mov-Anweisung), so dass ich vermute, es verwendet einen CPU-register als Zwischenspeicher beim kopieren?
Aber wie geht das kopieren? Blöcken (wie würde das kopieren von Blöcken?), von einzelnen bytes (char) oder die größte Daten-Typ Sie haben (kopieren in die lange Doppel-s - die 12 bytes auf meinem system).
EDIT: Ok anscheinend kann man verschieben von Daten von RAM zu RAM direktich bin nicht ein Montage-Experten und alle, die ich gelernt habe über die Versammlung ist aus diesem Dokument durch ( X86 assembly guide ), die erwähnt in dem Abschnitt über die " mov " - Anweisung, dass Sie sich nicht bewegen können, von RAM zu RAM. Offensichtlich ist dies nicht wahr.
InformationsquelleAutor der Frage hddh | 2013-07-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hängt. Im Allgemeinen, Sie konnte körperlich nicht alles kopieren, das größer ist als das größte nutzbare register in einem einzigen Zyklus, aber das ist nicht wirklich, wie Maschinen Arbeit in diesen Tagen. In der Praxis hat man wirklich weniger kümmern, was die CPU tut und mehr über die Eigenschaften von DRAM. Der Speicher-Hierarchie der Maschine spielt eine entscheidende entscheidende Rolle bei der Durchführung dieser Kopie in der schnellsten möglichen Weise (z.B., Sie laden die ganze cache-lines? Was ist die Größe einer DRAM-Zeile mit Bezug auf den Kopiervorgang?). Eine Implementierung kann stattdessen wählen, verwenden Sie eine Art von Vektor-Anweisungen für die Umsetzung
memcpy
. Ohne Bezug zu einer spezifischen Anwendung, es ist effektiv ein byte-für-byte-Kopie mit einer ein-Platz-Puffer.Hier ist ein Spaß-Artikel , beschreibt eine person, die Abenteuer in die Optimierung
memcpy
. Die wichtigsten take-home Punkt ist, dass es immer gehen wird, um gezielt zu einer bestimmten Architektur und Umwelt auf der Grundlage der Anweisungen, die Sie ausführen können, kostengünstig.InformationsquelleAutor der Antwort Gian
Die Umsetzung der
memcpy
ist sehr spezifisch für das system, in dem es umgesetzt wird. Implementierungen sind oft hardware-assisted.Speicher-zu-Speicher-mov-Anweisungen sind nicht so ungewöhnlich, dass - Sie haben es schon seit mindestens
PDP-11
mal, wenn Sie schreiben, könnte so etwas wie dieses:Die auskommentierte Zeile ist etwa äquivalent zu C ' s
Moderne CPUs haben Anweisungen, die Umsetzung
memcpy
direkt: Sie laden spezieller Register mit der Quell-und Ziel-Adressen, rufen Sie eine memory-copy-Befehl, und lassen die CPU den rest erledigen.InformationsquelleAutor der Antwort dasblinkenlight
Einer trivialen Implementierung von
memcpy
ist:Aber
glibc
in der Regel verwendet einige clevere Implementierungen in Assembler-code.memcpy
Anrufe sind in der Regel eingebettet.Auf x86, der code überprüft, ob der parameter "Größe" ist ein literal Vielfaches von
2
oder ein Vielfaches von4
(mitgcc
gelieferten Funktionen) und verwendet eine Schleife mitmovl
Anleitung (Kopie4
bytes) andernfalls ruft es den Allgemeinen Fall.Allgemeinen Fall verwendet das schnelle block kopieren Montage mit
rep
undmovsl
Anweisungen.InformationsquelleAutor der Antwort ouah