작성한 코드의 정확성은 최적화에 의존 해서는 안됩니다 . 스펙에서 사용하는 C ++ "가상 머신"에서 실행될 때 올바른 결과를 출력해야합니다.
그러나 당신이 말하는 것은 더 효율적인 종류의 질문입니다. RVO 최적화 컴파일러로 최적화하면 코드가 더 잘 실행됩니다. 다른 답변에서 지적한 모든 이유로 괜찮습니다.
그러나이 최적화가 필요한 경우 (예 : 복사 생성자가 실제로 코드를 실패하게하는 경우) 이제 컴파일러의 변덕에 있습니다.
내 자신의 연습에서 이것의 가장 좋은 예는 꼬리 호출 최적화라고 생각합니다.
int sillyAdd(int a, int b)
{
if (b == 0)
return a;
return sillyAdd(a + 1, b - 1);
}
어리석은 예이지만 함수의 끝에서 함수가 재귀 적으로 호출되는 꼬리 호출을 보여줍니다. C ++ 가상 머신은이 코드가 올바르게 작동 함을 보여 주지만, 왜 처음에 그러한 추가 루틴을 작성하는 것을 귀찮게 했는지에 대해 약간의 혼란을 초래할 수 있습니다 . 그러나 실제 C ++ 구현에서는 스택이 있으며 공간이 제한되어 있습니다. Pedantically 수행하는 경우,이 기능은 b + 1
스택 프레임을 스택에 추가 할 때 스택 프레임에 추가해야합니다. 계산하고 싶다면 sillyAdd(5, 7)
큰 문제가 아닙니다. 계산하고 싶다면 sillyAdd(0, 1000000000)
실제로 StackOverflow (및 좋은 종류는 아님) 를 일으키는 데 어려움을 겪을 수 있습니다 .
그러나 마지막 리턴 라인에 도달하면 현재 스택 프레임의 모든 작업이 완료된 것을 볼 수 있습니다. 우리는 실제로 그것을 유지할 필요가 없습니다. 테일 콜 최적화를 통해 다음 기능에 기존 스택 프레임을 "재사용"할 수 있습니다. 이런 식으로 우리는 1 개가 아닌 1 개의 스택 프레임 만 있으면 b+1
됩니다. (우리는 여전히 엉뚱한 덧셈과 뺄셈을 모두 수행해야하지만 더 많은 공간을 차지하지 않습니다.) 실제로 최적화는 코드를 다음과 같이 바꿉니다.
int sillyAdd(int a, int b)
{
begin:
if (b == 0)
return a;
// return sillyAdd(a + 1, b - 1);
a = a + 1;
b = b - 1;
goto begin;
}
일부 언어에서는 사양에서 테일 콜 최적화가 명시 적으로 필요합니다. C ++은 그중 하나 가 아닙니다 . 사례별로 가지 않는 한이 꼬리 호출 최적화 기회를 인식하기 위해 C ++ 컴파일러에 의존 할 수 없습니다. 내 Visual Studio 버전에서 릴리스 버전은 테일 콜 최적화를 수행하지만 디버그 버전은 의도적으로 설계되지 않았습니다.
따라서 내가 계산할 수있는 것에 의존 하는 것은 나쁘다 sillyAdd(0, 1000000000)
.