LINUX.ORG.RU

История изменений

Исправление 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   

Т.ч. не неадо пытаться быть умней компилятора (точнее тех людей, кто его писал).