Frage

Unter welchen Umständen sollte ich memcpys erwarten Zuweisungen auf moderne INTEL / AMD-Hardware zu übertreffen? Ich bin mit GCC 4.2.x auf einer 32-Bit-Intel-Plattform (aber bin an 64-Bit als auch).

War es hilfreich?

Lösung

Sie sollten nie outperform Zuweisungen erwarten. Der Grund hierfür ist, die Compiler Memcpy trotzdem verwenden, wenn es denkt, es wäre schneller sein (wenn Sie Flags verwenden optimieren). Wenn nicht, und wenn die Struktur angemessen klein, dass sie in den Register passen, könnte direkte Register Manipulation verwendet werden, die keinen Speicherzugriff auf alle erfordern würden.

GCC hat spezielle Block-Move-Muster, dass, wenn intern direkt ausrechnen auf Register / Speicherzellen ändern, oder wenn die Memcpy Funktion zu verwenden. Beachten Sie, wenn die Struktur der Zuordnung der Compiler bei der Kompilierung weiß, wie groß der Schritt sein wird, so kann es entrollen kleine Kopien (mit dem Zug n-mal in Folge statt Looping) zum Beispiel. Hinweis -mno-memcpy:

-mmemcpy
-mno-memcpy
    Force (do not force) the use of "memcpy()" for non-trivial block moves.  
    The default is -mno-memcpy, which allows GCC to inline most constant-sized copies.

Wer weiß es besser, wenn Memcpy zu verwenden, als der Compiler selbst?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top