아래 이영우님의 방법을 매크로 함수로 쓰면,
#define swap_number(a,b) ( (a) += (b); (b) = (a) - (b); (a) -= (b); )
이 됩니다.
(+, - 보다는 +=, -=가 더 빠릅니다. +=, -=는 어셈블리 코드에 1:1로 대응되기 때문이죠.)
위와 비슷하지만, 좀 더 빠른 방법이 있습니다.
#define swap_int(a,b) ( (a)^=(b); (b)^=(a); (a)^=(b); )
+ 연산보다는 ^(XOR) 연산이 훨씬 빠르기 때문입니다.
결정적인 단점은 (당연히!)정수형 변수(int, long, char 등)만 가능합니다.
이영우님의 방법도 정수나 실수만 가능하다는 단점이 있습니다.
그 외의 타입을 써야 한다면, 당연히 임시 변수를 만드는 방법을 써야겠죠.
그리고 최고로 빠른 방법도 있습니다.
Pentium Pro 이상의 CPU에서 제공하는 xchg 명령어를 사용하면 됩니다.
#define swap_asm(a, b) ( asm mov eax, (a); asm xchg (b), eax; asm mov (a), eax; )
이 방법은 물론 int와 unsigned int만 가능하죠.
극도의 최적화가 필요하다면 써보세요.
참고로, ANSI C++에서는 이러한 swap 함수를 기본으로 제공합니다.
물론 다음과 같이 구현되어 있지요.
template <typename T>
void swap(T& a, T& b)
{
T tmp = a;
a = b;
b = tmp;
}
|