<ALGORITHM>/SUMMARIZE
0. 교환함수(Swap)
CodeGrimie
2021. 1. 17. 01:24
포인터 방식
C99
▼ 관련 개념
Pointer & Call By Address
▼ 구현 코드
void Swap(int* lhs, int* rhs)
{
int _temp = *lhs;
*lhs = *rhs;
*rhs = _temp;
}
▼ 사용 예시
Swap(&lhs, &rhs);
포인터(*)를 이용한 방법이다.
포인터는 C 표준에서는 함수 인자에 직접적으로 접근할 수 있는 유일한 방법이다.
CPP B.11
▼ 관련 개념
Reference & Call By Reference
▼ 구현 코드
void Swap(int& lhs, int& rhs)
{
int temp = lhs;
lhs = rhs;
rhs = lhs;
}
▼ 사용 예시
Swap(lhs, rhs);
참조자(&)를 이용한 방법이다.
CPP에서 추가된 참조자를 사용한 방법으로 기존 C의 방법에 비해 사용할 때 편리성이 개선되었다.
CPP A.11
▼ 관련 개념
Template & Call By Reference
▼ 구현 코드
template<typename T>
void Swap(T& lhs, T& rhs)
{
int temp = lhs;
lhs = rhs;
rhs = lhs;
}
▼ 사용 예시
Swap(lhs, rhs);
주형(Template)을 이용한 방법이다.
CPP 11에서 추가된 기능인 주형을 이용한 방법으로 기존 CPP의 방법에 비해 변수형에 관계없이 동일한 기능을 하기 때문에 편리성이 크게 개선되었다.
XOR 방식
C99 & CPP B.11 & CPP A.11
▼ 관련 개념
Pointer & Call By Address & Call By Reference & XOR
▼ 구현 코드
// C99
void Swap(int* lhs, int* rhs)
{
if (lhs != rhs)
{
*lhs ^= *rhs;
*rhs ^= *lhs;
*lhs ^= *rhs;
}
}
// CPP B.11
void Swap(int& lhs, int& rhs)
{
if (&lhs != &rhs)
{
lhs ^= rhs;
rhs ^= lhs;
lhs ^= rhs;
}
}
// CPP A.11
template<typename T>
void Swap(T& lhs, T& rhs)
{
if (&lhs != &rhs)
{
lhs ^= rhs;
rhs ^= lhs;
lhs ^= rhs;
}
}
▼ 사용 예시
// C99
Swap(&lhs, &rhs);
// CPP B.11 & A.11
Swap(lhs, rhs);
XOR(^)를 이용한 방법이다.
데이터 의존성이 큰 방법이기 때문에 현세대의 컴파일러에서는 좀 더 느리다.
인라인 함수를 지원하는 컴파일러라면 프로그래머가 코드 최적화를 통해 비슷한 속도까지 낼 수는 있다.
그리고 필요한 메모리와 캐시가 줄기 때문에 임베디드 쪽에서는 아직도 종종 사용되는 방법이다.
XOR 연산을 이용해서 Swap 함수를 구현할 수 있다는 걸 발상한 선배 프로그래머들이 대단할 뿐이다.