[C++] 반환값 최적화(Return Value Optimization)
보통 컴파일러 최적화 기법들은 벤더들마다 제멋대로 사용하는 경우가 많은데, 개중에서도 독특하게 표준으로 명시된 최적화가 있다.
그게 바로 반환값 최적화다. 이 최적화는 C++11부터 표준으로 보장이 된다.
다만 C에서는 표준에도 없고, 구현도 거의 안돼있다.
일단 예시를 봐보자

위 코드는 T를 생성하고 반환하는 함수 makeT()를 사용해서 변수에 대입한다.
기본적인 문법 구조만 생각해본다면, makeT 함수 내에서 생성을 하고, 반환을 하는 과정에서 한번의 복사가 이루어져야 한다. 그럼에도 복사생성자는 한번도 불리지 않았다.
return T() 구문이 임시 변수를 함수 내에서 할당하고 반환하는게 아니라, 아예 저 main함수에서 할당하기 때문이다.
그리고 T t = makeT(); 할당부분에선 컴파일러 상태에 따라 복사생성자가 한번은 불릴 수도 있고, 아닐 수도 있다.
위에서는 이름없는 임시객체를 반환했는데, 이름있는 변수를 반환할때도 반환값 최적화가 수행된다. Named Return Value Optimization이라고 한다.

변수를 할당하고 반환했음에도 위와 같이 복사가 수행되지 않는다.
makeT 내에서 선언한 T t;를 함수 내에서 처리하는 것이 아니라 main 스코프에 둬버리고 연산하도록 바이너리를 짜내기 때문이다.
이것도 컴파일러 상태에 따라서 복사가 한번은 될 수 있다만, 일단 여기선 안한다.
여튼 중요한건 함수 내에서 변수를 할당하고 반환할 때는 복사비용을 걱정하지 않아도 된단것이다.
반환값최적화가 사실상의 이동을 수행하니 이런 부분에서는 무브시맨틱과 오른값참조를 사용하지 않아도 된다. 사용하지 않는게 좋다.
그리고 C에선 이런거 없으니까 반환하지 말고 포인터로 받아서 수정하는 식으로 짜는게 성능에 좋다.