-
특정 함수 안에서 전역변수를 반환하면 복사 생성자가 호출될까요, 컴파일러가 알아서 최적화를 수행해줄까요. 정답은 최적화 옵션을 줘도 최적화는 이뤄지지 않고 복사 생성자가 호출됩니다.
#include <iostream> using std::cout; using std::endl; class Person { public: Person() { cout << "Person" << endl; } Person(const Person& rhs) { cout << "Person Copy" << endl; } ~Person() { cout << "~Person" << endl; } }; Person person; Person func() { return person; } int main() { auto p = func(); }
반환 값을 Person&로 해도 반환 값을 받는 쪽이 lvalue reference가 아니라면 복사가 일어납니다. 어떻게 보면 당연한 소리죠. 레퍼런스로 객체로 새로운 객체를 만드는 거니까요. 복사를 통해서 만드는 거니까요. 반환 값도 레퍼런스, 받을 때도 레퍼런스여야 복사가 일어나지 않습니다. auto는 기본이 값 복사이기 때문에 &를 직접 붙여줘야 합니다.
Person& func() { return person; } int main() { auto& p = func(); }
'개발 > C·C++' 카테고리의 다른 글
메모리 정렬, 패딩 그리고 비트필드(feat. 구조체) (0) 2024.07.07 문자열 파싱 연습하기(feat. strtok_s) (0) 2024.07.04 shared_ptr 사용할 때 주의 사항 (0) 2022.01.09 전달 참조(보편 참조) (0) 2022.01.08 RVO, NRVO (0) 2022.01.08