본문 바로가기
Programming

클래스 swap에 대한 고찰

by leanu 2008. 9. 17.
Introduction
----------------------------------------------------------------------------------------------
  기존의 swap은 어떤 타입이든(대입 연산자 '=' 를 이용할 수 있다면) 가능한 std 범용 함수이다. 하지만 클래스 내부 멤버 변수가 엄청나게 큰 데이터를 가지고 있다면, 복사에 드는 비용은 실로 어마어마하다고 할 수 있다. 이런경우 두 객체의 멤버 변수 포인트만 바꿔주는, 기존의 동작과는 약간 다른 특화된 swap을 만들 필요가 있다. 지금부터 설명하고자 하는 특화된 swap에 대한 방법은 Effective c++에서 소개한 방법을 인용하기로 한다.

Before implementing specialized swap function
----------------------------------------------------------------------------------------------

    1. 표준 제공 swap함수의 성능이 내가 만든 클래스에서 만족할 만한 성능을 지니면
       그냥 쓴다.

    2. 그렇지 않은 경우 클래스 내부에 swap 멤버 함수를 퍼블릭으로 선언하라. 그리고
       그 안에는 빠른 swap 알고리즘을 기술한다.

       (예) MyClass {
            public:
                ...
                swap(MyClass target) { // Write Fast swap algo }
            private:
                ...
           };

    3. 내가 구현한 클래스를 둘러싸고 있는 네임스페이스 안에 swap 함수를 많들어 넣고
       이 함수 안에서 MyClass에서 만든 swap 멤버 함수를 호출하도록 만든다.

        namespace MyNamespace
        {
             ...
             MyClass {
                 ...
             };
             ...
             void swap(MyClass& a, MyClass& b)
             {
                  a.swap(b);
             }
        } // end - MyNamespace
      
  < Suggestion > swap은 절대로 예외를 발생시키자 않도록 만들어라. swap은 예외 발생시 이전상태로 돌릴수 있게 응용할 수 있는 강력한 함수이기 때문에(strong- exception-safety guarantee) 예외를 던지지 않게 설계한다면 유용하게 이용할 수 있을 것이다.

댓글