ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 복사 생성자와 이동 생성자
    개발/C·C++ 2021. 12. 27. 19:56
    	list<A> aList;
    	aList.push_back(A(1));

    위의 코드는 어떤 생성자가 호출될까요? RVO가 적용될까요? push_back 함수는 값을 인자로 받는 push_back 함수는 오버로딩되어 있지 않습니다. const T& 이거나 T&& 입니다.

    void push_back(const _Ty& _Val) {
        _Emplace(_Mypair._Myval2._Myhead, _Val);
    }
        
        
    void push_back(_Ty&& _Val) { // insert element at end
        _Emplace(_Mypair._Myval2._Myhead, _STD move(_Val));
    }

    A 클래스에 이동 생성자가 정의되어 있지 않으면 const lvalue reference를 파라미터로 받는 함수가 호출될 겁니다. 그리고 A 클래스에는 이동 생성자가 없습니다. 추가적으로 Sum 함수도 같이 보겠습니다.

    class A
    {
    public:
    	A(int val) : _val(val)
    	{
    		cout << "+A";
    	}
    	A(const A& rhs)
    	{
    		cout << "+Acopy";
    	}
    	int GetVal()
    	{
    		return _val;
    	}
    
    private:
    	int _val;
    };
    
    int Sum(list<A> a)
    {
    	cout << endl;
    	cout << "BeginOfSum" << endl;
    	int sum = 0;
    	for (auto c : a)
    	{
    		sum += c.GetVal();
    	}
    	cout << endl;
    	cout << "EndOfSum" << endl;
    	return sum;
    }

     

    이와 같은 상태에서 다음 코드를 실행해봅시다.

    int main()
    {
    	list<A> aList;
    	aList.push_back(A(1));
    	cout << endl;
    	aList.push_back(A(2));
    	cout << endl;
    	auto result = Sum(aList);
    }

    문자열 출력 결과는 다음과 같은데요.

    +A+Acopy
    +A+Acopy
    +Acopy+Acopy
    BeginOfSum
    +Acopy+Acopy
    EndOfSum

    BeginOfSum 전에 출력된 것은 인수로 전달된 aList의 내부 데이터가 복사되면서 호출된 것입니다. 하나를 더 확인해봅시다. 임시객체를 반환하면 RVO(Return Value Optimization)가 일어납니다. 함수의 파라미터로 전달할 때도 마찬가지입니다.

    B func()
    {
    	return B();
    }
    
    int main()
    {
    	auto result = func(); // auto result = B(), B b; 와 동일
    }
    +A+B-B-A

     

    '개발 > C·C++' 카테고리의 다른 글

    get 함수를 const로 해야 하는 이유  (0) 2022.01.04
    알아두면 좋을 개념  (0) 2022.01.03
    객체 생성 시 함수 호출 순서  (0) 2021.12.27
    바이트 정렬  (0) 2021.09.24
    union  (0) 2021.09.24

    댓글

Designed by Tistory.