LINUX.ORG.RU

ЧЯДНТ?

Через жопу пишешь обмен значений. Вот почему не через временную переменную?

А вообще, такой же ворнинг будет, если написать

int main()
{
    1 + 2;
}

ilammy ★★★
()

SWAP(A, B) (((A) ^ (B)) && ((B) ^= (A) ^= (B), (A) ^= (B)))

Это называется «смотрите как я могу!». Лучше бы показал, что ты знаешь про do {...} while(0);

crowbar
()
Ответ на: комментарий от crowbar

On January 20, 2005, Iain A. Fleming pointed out that the macro above doesn't work when you swap with the same memory location, such as SWAP(a, a[j]) with i == j. So if that may occur, consider defining the macro as (((a) == (b)) || (((a) ^= (b)), ((b) ^= (a)), ((a) ^= (b)))). On July 14, 2009, Hallvard Furuseth suggested that on some machines, (((a) ^ (b)) && ((b) ^= (a) ^= (b), (a) ^= (b))) might be faster, since the (a) ^ (b) expression is reused.

inn
() автор топика
Ответ на: комментарий от ilammy

On January 20, 2005, Iain A. Fleming pointed out that the macro above doesn't work when you swap with the same memory location, such as SWAP(a, a[j]) with i == j. So if that may occur, consider defining the macro as (((a) == (b)) || (((a) ^= (b)), ((b) ^= (a)), ((a) ^= (b)))). On July 14, 2009, Hallvard Furuseth suggested that on some machines, (((a) ^ (b)) && ((b) ^= (a) ^= (b), (a) ^= (b))) might be faster, since the (a) ^ (b) expression is reused.

inn
() автор топика

ЧЯДНТ?

Вычислили y1, а результат не используете.

Sorcerer ★★★★★
()
Ответ на: комментарий от inn

might be faster

ilammy /tmp % cat a.c
#define SWAP(A, B) (((A) ^ (B)) && ((B) ^= (A) ^= (B), (A) ^= (B)))

int main()
{
    volatile int a, b;
    SWAP(a, b);
}
ilammy /tmp % cat b.c
#define SWAP(A, B) do {                         \
    typeof(A) tmp = (A); (A) = (B); (B) = tmp;  \
} while (0)

int main()
{
    volatile int a, b;
    SWAP(a, b);
}
ilammy /tmp % gcc -O2 -S a.c
ilammy /tmp % gcc -O2 -S b.c
ilammy /tmp % cat a.s
...
main:
.LFB0:
        .cfi_startproc
        movl    -8(%rsp), %edx
        movl    -4(%rsp), %eax
        cmpl    %eax, %edx
        je      .L3
        movl    -8(%rsp), %edx
        movl    -4(%rsp), %eax
        xorl    %edx, %eax
        movl    %eax, -8(%rsp)
        movl    -4(%rsp), %edx
        xorl    %eax, %edx
        movl    %edx, -4(%rsp)
        movl    -8(%rsp), %edx
        movl    -4(%rsp), %eax
        xorl    %edx, %eax
        movl    %eax, -8(%rsp)
.L3:
        rep
        ret
        .cfi_endproc
...
ilammy /tmp % cat b.s
main:
.LFB0:
        .cfi_startproc
        movl    -12(%rsp), %eax
        movl    %eax, -4(%rsp)
        movl    -8(%rsp), %eax
        movl    %eax, -12(%rsp)
        movl    -4(%rsp), %eax
        movl    %eax, -8(%rsp)
        ret
        .cfi_endproc

(Исправил баг. На суть не повлияло.)

ilammy ★★★
()
Последнее исправление: ilammy (всего исправлений: 1)
Ответ на: комментарий от inn

Ещё в интернете пишут, что реальные пацаны пишут на ассемблере и у них всё летает.

anonymous
()

ЧЯДНТ?

Занимаешься байтоложеством.

Компилятор имеет ввиду, что значение выражения вида a && b не используется. Поэтому следует писать if(a) b;

NeXTSTEP ★★
()

ЧЯДНТ?

KISS + «Преждевременная оптимизация — корень всех зол.»

Archer73
()

По-моему, ты всё делаешь не так.

Miguel ★★★★★
()
Ответ на: комментарий от crowbar

что ты знаешь про do {...} while(0);

лучше бы он использовал inline

dimon555 ★★★★★
()

Кажется, я начал понимать разработчиков Go, у которых такое поведение считается ошибочным.

buddhist ★★★★★
()
Ответ на: комментарий от inn

Если Вы решаете такие задачи и на таком уровне, что выигрыш от этого изврата действительно существенный, то Вы какой то аццкий мегагару, и я не понимаю почему Вы тут задаете такие вопросы О_О.

Но судя по тому, что Вы их таки задаете... Вам так делать не надо;-)

AIv ★★★★★
()
Ответ на: комментарий от AIv

Исчерпывающе полный ответ. Молчаливое одобрение в зале.

unt1tled ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.