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?


  • Mod

    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.


Anmelden zum Antworten