memcpy vs. xxx
-
Ich frage mich schon eine ganze Weile, wie man am besten x-Dimensionale Arrays kopieren solle. empfielt sich memcpy oder ist es alter C Kram? Is es das gleiche, wie wenn ich mit Schleifen den Inhalt kopiere?
-
memcpy ist viel schneller als eine selbstgebaute for-Schleife da es Assembler-"Tricks" benutzt.
-
nach dem was ich hier gelesen habe, lohnt es sich als Speed-Junkie
schon, mal ne eigene implementierung zu starten und paar tests zu fahren. der c++ weg ist aber wahrscheinlich eher, eine iterator unterstützende multi-dim-array klasse und copy zu benutzen.
-
Also wenn es sich um reine POD handelt, dann kann man memcpy einsetzen, aber sobald man komplexere Klassen benutzt, müssen auf jeden Fall eigene Kopierfunktionen benutzt werden (d.h. Copy-Konstruktor bzw. Assignment-Operator bei der eigenen Klasse implementieren!).
-
Mir geht es hauptsächlich darum, den Copykonstruktor von einer "Image class" zu beschleunigen. Was steht überhaut in der memcpy in asm drinne?
-
Mal als Beispiel
Func@ memcpy, _EXPFUNC, _RTLENTRY, <pointer dest>,<pointer src>,<int n> Link@ esi,edi mov edi,dest ; get dest mov eax,edi ; copy to eax for return value mov esi,src mov ecx,n mov edx,ecx ; save count shr ecx,1 ; calculate longword count shr ecx,1 cld rep movsd ; copy longwords mov ecx,edx ; get back count and ecx,3 ; calculate remainder byte count (0-3) rep movsb ; copy remaining bytes Unlink@ esi,edi Return@ EndFunc@ memcpy
-
thx, kann ich das jetzt in einen inline asm Block setzen?
-
Tc++H schrieb:
thx, kann ich das jetzt in einen inline asm Block setzen?
was sollte das bringen? wenn du memcpy schreibst, weiss der compiler wenigstens, was du willst, und kann das ganze evtl. noch optimieren (gerade bei einem copy-ctor kennt der compiler die alignment-voraussetzungen der operanden). zudem gibst du unnötig wartbarkeit und portabilität auf.
-
Tc++H schrieb:
Mir geht es hauptsächlich darum, den Copykonstruktor von einer "Image class" zu beschleunigen. Was steht überhaut in der memcpy in asm drinne?
Nichts was man hier posten könnte.

memcpy ist eine Funktion, die idR von Compilern intrinsic implementiert wird. Dh, der Compiler "erzeugt" den Code für die Funktion erst, wenn er die entsprechende Stelle übersetzt. Das Ergebns des Codes hängt dann von den begleitenden Umständen ab, wie zB Alignment oder verwendeten Registern. Man kann so eine intrinsic Funktion auch wie eine in den Compiler eingebaute inline Funktion betrachten. Früher hat man versucht, solche simplen Funktionen selbst zu schreiben, um zB die Vorteile von CPU Befehlserweiterungen zu nutzen. Heute macht das keinen Sinn mehr, da moderne Compiler ausreichend Optionen für solche Erweiterungen anbieten und diese dann auch entsprechend nutzen. Mach dir also nicht erst die Mühe, so eine Funktion selbst zu schreiben. Du wirst dadurch sehr wahrscheinlich nichts gewinnen. Benutze einfach memcpy, und gut ist.
Ansonsten, was die Optimierung deines ctors betrifft, falls deine Elemente PODs sind und plain gespeichert werden, kannst du memcpy benutzen. Etwas schnelleres wirst du kaum finden.