Verständnis für MSVS C ++ - Compiler-Optimierungen

8

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?

%Vor%     
Alex Zhukovskiy 08.07.2014, 09:57
quelle

2 Antworten

11

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

    
Hans Passant 08.07.2014, 11:46
quelle
0

51EB851Fh scheint die magische Zahl für Divisoren zu sein, die durch 100 geteilt werden

Quelle: Ссылка Antwort # 2

    
Bur0k 08.07.2014 10:07
quelle