-
Effective C++...23일지 2022. 7. 12. 07:47
예외를 던지지 않는 swap에 대한 지원도 생각해 보자
표준 라이브러리 swap의 동작
표준 라이브러리에 있는 swap은 다음과 같이 구현되는데, 한 번 호출에 복사가 세 번 일어난다.
namespace std {
template<typename T>
void swap(T& a, T& b)
{
T temp(a);
a = b;
b = temp;
}
}
일반적으로는 표준 라이브러리의 swap으로 충분하지만 대부분의 멤버가 포인터로 구성되어 있는 경우라면 복사 생성자를 호출하는 대신 포인터가 가리키는 대상만 바꿔주는 편이 더 효율적이므로 이런 경우엔 전용 swap을 구현하는 게 좋다.
전용 swap 구현 방법
전용 swap을 구현할 때는 다음과 같은 구현이 필요하다.
- public 멤버 함수 swap 두 객체의 값을 맞바꾸는 예외를 던지지 않는 함수
- 같은 네임스페이스의 비멤버 swap 멤버 함수 swap을 호출하는 함수
사용자 관점의 swap 함수 사용
사용자가 swap을 호출할 때는 전용 swap이 있으면 그것을 사용하고 그렇지 않으면 표준 라이브러리의 swap을 사용하도록 하려고 할 때 다음과 같이 사용하면 된다.
template<typename T>
void doSomething(T& obj1, T& obj2)
{
using std::swap;...
swap(obj1, obj2);
...
}
※ 컴파일러는 인자 기반 탐색을 통해 특수화된 함수를 검색하고 없는 경우 using으로 선언된 표준 라이브러리 함수를 사용한다.