며칠 전에 페북에서 "Temp 변수 없이 Swap을 하는 방법"에 대한 글을 봤었습니다.
프로그래밍 관련 입문서들을 보면 거의 빠짐 없이 나오는 내용이죠. (^^)
보통은 Temp 변수를 하나 선언해서 Swap을 하는데 Temp 변수 없이 Swap을 시킨다니...
전에도 그런 방법이 있다는 건 들었는데
대충 봤었던 터라 흥미도 생기고 해서 찬찬히 읽어봤었습니다.
그렇게 어렵거나, 복잡한 내용은 아니더군요. (^0^;)
http://www.thecrazyprogrammer.com/2014/02/how-to-swap-two-numbers-without-using-temporary-variable-or-arithmetic-operators.html
혹시나 해서
Temp 변수 없이 Swap을 하면 아~~~~~~~~~~~주 조금이라도
속도를 높일 수 있지 않을까해서 테스트를 해봤습니다.
Test 결과)
우리가 알고 있는 기존 방법이 약 5초 정도 걸린다면
Temp 변수없이 Swap 하는 방법은 약 7초 정도 걸림... (-_-;;)
결론) Temp 변수 없이 Swap 하는 방법을 쓸 이유는 전혀 없음.
의의) 걍 상식차원에서 그런 방법도 있다더라!!! 라고 이해하자! (^0^)/
혹시나 해서 컴파일 후 어셈으로 된 코드를 봤는데
Temp 변수를 써서 Swap을 하는 방법이 제일 단촐(?)하더군요.
Temp 변수 써서 Swap --- mov 연산 10번
Temp 변수 안쓰고 Swap --- mov 연산 11번에
add 연산 1번에
sub 연산 2번
Temp 변수 안쓰고 Swap(2)
xor 연산을 써서 --- mov연산 9번에
xor 연산 3번
P.S. - 뒷북이라면 죄송~~~ m(_ _)m
|
#define swap(a,b) (a)-=((b)=((a)+=(b))-(b))
#define swap_tmp(a,b,tmp) tmp=b;b=a;a=tmp;
#define swap_xor(a,b) (a)^=((b)^=((a)^=(b)))
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int a = -100, b=30, tmp;
swap(a,b);
swap_tmp(a,b,tmp);
swap_xor(a,b);
}
Unit1.cpp.24: swap(a,b);
00402EDE 8B45F0 mov eax,[ebp-$10]
00402EE1 0145F4 add [ebp-$0c],eax
00402EE4 8B55F4 mov edx,[ebp-$0c]
00402EE7 2B55F0 sub edx,[ebp-$10]
00402EEA 8955F0 mov [ebp-$10],edx
00402EED 2955F4 sub [ebp-$0c],edx
Unit1.cpp.25: swap_tmp(a,b,tmp);
00402EF0 8B45F0 mov eax,[ebp-$10]
00402EF3 8945EC mov [ebp-$14],eax
00402EF6 8B4DF4 mov ecx,[ebp-$0c]
00402EF9 894DF0 mov [ebp-$10],ecx
00402EFC 8B45EC mov eax,[ebp-$14]
00402EFF 8945F4 mov [ebp-$0c],eax
Unit1.cpp.26: swap_xor(a,b);
00402F02 8B55F0 mov edx,[ebp-$10]
00402F05 3155F4 xor [ebp-$0c],edx
00402F08 8B4DF4 mov ecx,[ebp-$0c]
00402F0B 314DF0 xor [ebp-$10],ecx
00402F0E 8B45F0 mov eax,[ebp-$10]
00402F11 3145F4 xor [ebp-$0c],eax