C와 C ++에서 꼬리 재귀 최적화를 수행하는 것이 완벽하게 잘 작동하는 것처럼 보이지만 디버깅하는 동안이 최적화를 나타내는 프레임 스택을 보지 못하는 것 같습니다. 스택은 재귀의 깊이를 알려주기 때문에 좋은 것입니다. 그러나 최적화도 좋습니다.
C ++ 컴파일러가이 최적화를 수행합니까? 왜? 왜 안돼?
컴파일러에게 지시하는 방법은 무엇입니까?
- MSVC의 경우 :
/O2
또는/Ox
- GCC의 경우 :
-O2
또는-O3
컴파일러가 특정 경우 에이 작업을 수행했는지 확인하는 것은 어떻습니까?
- MSVC의 경우 PDB 출력이 코드를 추적 할 수 있도록 설정 한 다음 코드를 검사하십시오.
- GCC ..?
컴파일러가 특정 함수가 이와 같이 최적화되어 있는지 확인하는 방법에 대한 제안을 계속합니다 (Konrad가 나에게 그것을 가정한다고 확신하더라도)
컴파일러가 무한 재귀를 만들고 무한 루프 또는 스택 오버플로가 발생하는지 확인하여 컴파일러 가이 작업을 수행하는지 항상 확인할 수 있지만 (GCC 로이 작업을 수행하고 -O2
충분 하다는 것을 알았습니다 ) 내가 아는 특정 기능을 확인하면 어쨌든 종료됩니다. 나는 이것을 확인하는 쉬운 방법을 갖고 싶다 :)
몇 가지 테스트 후, 소멸자 가이 최적화를 할 가능성을 망치는 것을 발견했습니다. 리턴 문이 시작되기 전에 특정 변수 및 임시 범위의 범위를 변경하여 범위를 벗어나는 것이 때때로 가치가있을 수 있습니다.
테일 콜 이후에 소멸자를 실행해야하는 경우 테일 콜 최적화를 수행 할 수 없습니다.