我想换两个号码
How to swap two numbers
在comments部分,我们提到使用临时变量更好下面是我从链接中复制的注释
如果我们从CPU指令的角度来看问题,使用tmp会比以上3种方法更好,我已经对所有这4种方法(包括4by?使用临时变量)不出所料,第四种方法胜过以上三种方法原因是CPU如何将变量移入寄存器,以及我们需要使用多少寄存器。
但我找不到它是如何工作的线索有人能给我解释一下它在处理器级是如何工作的,为什么temp变量更好(如果是的话)?

最佳答案

查看在这个级别上进行哪种优化的唯一方法是编译和反汇编事实证明,编译器已经非常擅长删除或重新解释代码,以使其更快。
我使用MS C编译器编译了这段代码:

int main()
{
        int a = 1;
        int b = 2;
        int c;

        // Force use of the variables so they aren't optimized away
        printf("a = %d, b = %d\n", a, b);

        c = b;
        b = a;
        a = c;

        // Force use again
        printf("a = %d, b = %d\n", a, b);

        return 0;
}

这是优化后的实际输出,为简洁起见进行了编辑:
; 4    :    int a = 1;
; 5    :    int b = 2;
; 6    :    int c;

; OPTIMISED AWAY

; 8    :    printf("a = %d, b = %d\n", a, b);

    push    2
    push    1
    push    pointer_to_string_constant
    call    DWORD PTR __imp__printf

; 10   :    c = b;
; 11   :    b = a;
; 12   :    a = c;

; OPTIMISED AWAY

; 14   :    printf("a = %d, b = %d\n", a, b);

    push    1
    push    2
    push    pointer_to_string_constant
    call    DWORD PTR __imp__printf

; 16   :    return 0;

    xor eax, eax ; Just a faster way of saying "eax = 0;"

; 17   : }

    ret 0

所以你看,在这种情况下,编译器决定完全不使用任何变量,只将整数直接推送到堆栈中(这与在C中向函数传递参数是一样的)。
这个故事的寓意是,在进行微观优化时,不要对编译器进行二次猜测。

关于c - 交换两个数字-处理器行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25261744/

10-12 17:25