gpt4 book ai didi

c - 交换两个数字 - 处理器行为

转载 作者:太空宇宙 更新时间:2023-11-03 23:26:46 24 4
gpt4 key购买 nike

我正在寻找交换两个数字的替代选项并找到了链接 How to swap two numbers

在评论部分提到使用临时变量更好。以下是我从链接复制的评论

If we look at the problem at the CPU instructions perspective, use tmp will be better than all above 3 method, i have run a benchmark agains all those 4 method (including the 4th by ?using temp variable). without surprise, the 4th way beats all above 3 method. And the reason is how CPU move the variable into register and how many register we need to use.

但我无法找到有关其工作原理的线索。有人可以向我解释它在处理器级别的工作原理以及为什么 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com