我想你們都聽說過「交換問題」; SO充滿了關於它的問題。 不使用第三個變量的交換版本通常被認爲是更快的,因爲,你有一個變量更少。我想知道發生了什麼事情的窗簾後面,並寫了下面的兩個方案:變量交換有和沒有輔助變量 - 哪個更快?
int main() {
int a = 9;
int b = 5;
int swap;
swap = a;
a = b;
b = swap;
return 0;
}
和版本,而第三個變量:
int main() {
int a = 9;
int b = 5;
a ^= b;
b ^= a;
a ^= b;
return 0;
}
我生成使用鐺的彙編代碼,並得到了本作第一版本(即使用第三變量):
...
Ltmp0:
movq %rsp, %rbp
Ltmp1:
movl $0, %eax
movl $0, -4(%rbp)
movl $9, -8(%rbp)
movl $5, -12(%rbp)
movl -8(%rbp), %ecx
movl %ecx, -16(%rbp)
movl -12(%rbp), %ecx
movl %ecx, -8(%rbp)
movl -16(%rbp), %ecx
movl %ecx, -12(%rbp)
popq %rbp
ret
Leh_func_end0:
...
並且這對於所述第二版本(即不使用第三可變):
...
Ltmp0:
movq %rsp, %rbp
Ltmp1:
movl $0, %eax
movl $0, -4(%rbp)
movl $9, -8(%rbp)
movl $5, -12(%rbp)
movl -12(%rbp), %ecx
movl -8(%rbp), %edx
xorl %ecx, %edx
movl %edx, -8(%rbp)
movl -8(%rbp), %ecx
movl -12(%rbp), %edx
xorl %ecx, %edx
movl %edx, -12(%rbp)
movl -12(%rbp), %ecx
movl -8(%rbp), %edx
xorl %ecx, %edx
movl %edx, -8(%rbp)
popq %rbp
ret
Leh_func_end0:
...
第二個更長,但我不太瞭解彙編代碼,所以我不知道這是否意味着它更慢,所以我希望聽到更多人對此有所瞭解的意見。
以上哪個版本的變量swap速度更快,佔用的內存更少?
要找出哪個更快,爲什麼你不基準? – 2011-12-19 21:11:07
我不知道如何測量內存使用率,另外,我也對它背後的原因感興趣。 – shutefan 2011-12-19 21:16:35
它看起來不像編譯時打開優化。該組件中有很多絨毛。 – 2011-12-19 21:23:20