-
복사 생성자와 이동 생성자개발/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