Data Func(int Param)
{
Data data(Param);
return data;
}
이런 함수가 있는데 여기서 반환하면 'data의 정보를 가진 Data형 임시객체'가 생성되잖아요.
근데 data도 어쨋든 함수 내부에선 l-value인데
왜 반환할때는 r-value로써 복사생성자의 매개변수로 전해지는거죠?
아무리생각해도 data가 함수내부에서 r-value였다.. 라고 가정을 해야지만 말이되는얘긴데..
이건아닌거같아서ㅏ..
Data Func(int Param)
{
Data data(Param);
return data;
}
이런 함수가 있는데 여기서 반환하면 'data의 정보를 가진 Data형 임시객체'가 생성되잖아요.
근데 data도 어쨋든 함수 내부에선 l-value인데
왜 반환할때는 r-value로써 복사생성자의 매개변수로 전해지는거죠?
아무리생각해도 data가 함수내부에서 r-value였다.. 라고 가정을 해야지만 말이되는얘긴데..
이건아닌거같아서ㅏ..
return value optimization ( RVO ) 찾아 읽어보자.
원래는 lvalue 라서 무브가 아닌 복사생성이 됐었는데 -O2 부터였나 RVO 라는 최적화로 인해 무브가 됨. C++17 이상의 컴파일러부터는 모든 경우에서 RVO 가 적용 보장됨 - return 0;
표준 상에서는 guaranteed copy elision 으로 명시돼 있음 - return 0;
그니까 결론적으론 이동생성자를 명시하면 무브로서 인식한다는얘기인가요?
이동생성자를 기술하지않으면 그대로 복사생성이 일어나고?
아예 리턴할 때 std::move(data) 를 반환하면 무브 복사 생성을 강제할 수 있기는 한데 return 밸류의 기본 규칙이 조금더 복잡했던걸로 기억... 까먹음 - return 0;
C++17 부터는 무조건 RVO 강제 - return 0;
아.. 감사합니다
아 잠만 RVO랑 move랑 달랐던 것 같기도 하고 좀 헷갈리네 이쪽 규칙이 좀 복잡해서 - return 0;
http://en.cppreference.com/w/cpp/language/copy_elision
시간 날 때 읽어보셈 RVO 반환이랑 move는 다른 것 같긴 한듯 - return 0;