Wie lässt man den GCC-Compiler die Variablenteilung in Mul umwandeln (wenn es schneller ist)

int a, b;
scanf("%d %d", &a, &b);
printf("%d\n", (unsigned int)a/(unsigned char)b);

Wenn kompiliert, habe ich ...

    ::00401C1E::  C70424 24304000          MOV DWORD PTR [ESP],403024  %d %d
    ::00401C25::  E8 36FFFFFF              CALL 00401B60               scanf
    ::00401C2A::  0FB64C24 1C              MOVZX ECX,BYTE PTR [ESP+1C]
    ::00401C2F::  8B4424 18                MOV EAX,[ESP+18]                        
    ::00401C33::  31D2                     XOR EDX,EDX                             
    ::00401C35::  F7F1                     DIV ECX                                 
    ::00401C37::  894424 04                MOV [ESP+4],EAX                         
    ::00401C3B::  C70424 2A304000          MOV DWORD PTR [ESP],40302A  %d\x0A
    ::00401C42::  E8 21FFFFFF              CALL 00401B68               printf

Wird es schneller sein, wenn sich der DIV in MUL verwandelt und ein Array zum Speichern des Mulvalues verwendet? Wenn ja, wie kann der Compiler die Optimierung durchführen?

int main() {
    uint a, s=0, i, t;
    scanf("%d", &a);
    diviuint aa = a;
    t = clock();
    for (i=0; i<1000000000; i++)
        s += i/a;
    printf("Result:%10u\n", s);
    printf("Time:%12u\n", clock()-t);
    return 0;
}

where diviuint (a) mache einen Speicher von 1 / a und verwende stattdessen ein Vielfaches. Mit s + = i / aa wird die Geschwindigkeit 2-mal von s + = i / a

Antworten auf die Frage(8)

Ihre Antwort auf die Frage