ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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으로 선언된 표준 라이브러리 함수를 사용한다.

     

    댓글

Designed by Tistory.