История изменений
Исправление beastie, (текущая версия) :
Порой бывает даже хуже. Банальный пример: все помнят, что менять местами целочисленные значения XOR'ом — это супрекруто и супероптимально. А вот фигушки. ;)
#include <stdio.h>
void
swap1(int *a, int *b)
{
int c = *a; *a = *b; *b = c;
}
void
swap2(int *a, int *b)
{
*a ^= *b; *b ^= *a; *a ^= *b;
}
int
main()
{
int a = 7, b = 13;
printf("%d %d\n", a, b);
swap1(&a, &b);
printf("%d %d\n", a, b);
swap2(&a, &b);
printf("%d %d\n", a, b);
return 0;
}
И соответствующий выхлоп objdump:
0000000000000ca0 <swap1>: ca0: 8b 17 mov (%rdi),%edx ca2: 8b 06 mov (%rsi),%eax ca4: 89 07 mov %eax,(%rdi) ca6: 89 16 mov %edx,(%rsi) ca8: c3 retq 0000000000000ca9 <swap2>: ca9: 8b 07 mov (%rdi),%eax cab: 33 06 xor (%rsi),%eax cad: 89 07 mov %eax,(%rdi) caf: 33 06 xor (%rsi),%eax cb1: 89 06 mov %eax,(%rsi) cb3: 31 07 xor %eax,(%rdi) cb5: c3 retq
Т.ч. не надо пытаться быть умней компилятора (точнее тех людей, кто его писал).
Исходная версия beastie, :
Premature optimization is the root of all evil.
Порой бывает даже хуже. Банальный пример: все помнят, что менять местами целочисленные значения XOR'ом — это супрекруто и супероптимально. А вот фигушки. ;)
#include <stdio.h>
void
swap1(int *a, int *b)
{
int c = *a; *a = *b; *b = c;
}
void
swap2(int *a, int *b)
{
*a ^= *b; *b ^= *a; *a ^= *b;
}
int
main()
{
int a = 7, b = 13;
printf("%d %d\n", a, b);
swap1(&a, &b);
printf("%d %d\n", a, b);
swap2(&a, &b);
printf("%d %d\n", a, b);
return 0;
}
И соответствующий выхлоп objdump:
0000000000000ca0 <swap1>: ca0: 8b 17 mov (%rdi),%edx ca2: 8b 06 mov (%rsi),%eax ca4: 89 07 mov %eax,(%rdi) ca6: 89 16 mov %edx,(%rsi) ca8: c3 retq 0000000000000ca9 <swap2>: ca9: 8b 07 mov (%rdi),%eax cab: 33 06 xor (%rsi),%eax cad: 89 07 mov %eax,(%rdi) caf: 33 06 xor (%rsi),%eax cb1: 89 06 mov %eax,(%rsi) cb3: 31 07 xor %eax,(%rdi) cb5: c3 retq
Т.ч. не неадо пытаться быть умней компилятора (точнее тех людей, кто его писал).