Полагаю, вы все слышали о «проблеме обмена»; ТАК полно вопросов об этом.
Версию свопа без использования третьей переменной часто считают более быстрой, поскольку у вас на одну переменную меньше. Я хотел знать, что происходит за кулисами, и написал следующие две программы:
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;
}
Я сгенерировал ассемблерный код с помощью clang и получил его для первой версии (которая использует третью переменную):
...
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:
...
Второй длиннее, но я не очень разбираюсь в ассемблерном коде, поэтому я понятия не имею, означает ли это, что он медленнее, поэтому я хотел бы услышать мнение кого-то более знающего об этом.
Какая из перечисленных версий подкачки переменных быстрее и занимает меньше памяти?