Ich verstehe nicht, was in diesem Code passiert. Der C-Code lautet:
%Vor% Ich habe erwartet, dass die resultierende Assembly einige einfache Verschiebungen und Add / Sub-Operationen sein wird, aber es gibt einige magische Konstanten wie 51EB851Fh
, Multiplikationen usw. Was passiert hier?
Prozessoren sind nicht sehr gut beim Teilen, ein idiv kann zwischen 11 und 18 Zyklen dauern. Im Gegensatz zu Verschiebungen und Multiplikationen benötigen sie normalerweise nur einen einzigen Zyklus.
Also hat der Optimierer Ihre Division durch eine Multiplikation mit Festkommaarithmetik ersetzt, indem Sie eine 32-Bit-Multiplikation nutzen, die ein 64-Bit-Ergebnis in edx: eax erzeugt. Hüllkurve: n / 100 == n * 0.32 / 32 == n * (0.32 * pow (2.32)) / 32 / pow (2.32). Diese Divisionen sind sehr billig, nur eine Rechtsverschiebung. Und der Multiplikator wird 0.32 * pow (2,32) ~ = 1374389535 == 0x51EB851F
51EB851Fh scheint die magische Zahl für Divisoren zu sein, die durch 100 geteilt werden
Quelle: Ссылка Antwort # 2
Tags und Links optimization c c++ assembly visual-studio