C ++는 재귀 깊이를 제한 깊이?
파이썬에는 최대 재귀 깊이가 있습니다. 컴파일러는 아니라 인터프리터이기 때문인 것입니다. C ++에도 동일한 개념이 있습니까? 아니면 RAM 제한으로 만 연결되어 있습니까?
C ++의 제한은 스택의 최대 크기 때문입니다. 일반적으로 RAM 크기보다 훨씬 작지만 여전히 꽤 먹습니다. (다행히도 패키지 내용 과 같은 큰 것은 일반적으로 스택 자체에 보관되어 있습니다.)
스택 제한은 일반적으로 OS 수준에서 가능합니다. ( ulimit
Unix를 사용하는 경우 셸 내장 문서를 참조하십시오 .)이 컴퓨터 (OSX)의 8MB입니다.
물론, 스택의 크기는 재귀 할 수있는 깊이를 알아내는 데있어 그 자체로 완전히 도움이되지 않았습니다. 이를 알기 메시지 재귀 함수 (스택 프레임이라고도 함)의 활성화 레코드 (또는 레코드)의 크기를 계산해야합니다 . 이를 수행하는 가장 쉬운 방법 (내가 알고있는)은 디스어셈블러 (대부분의 디버거의 기능)를 사용하고 모든 함수의 시작과 끝에서 스택 포인터 조정의 크기를 읽는 것입니다. 지저분합니다. (예를 들어 두 번의 호출에서 변수에 대한 포인터 다른 차이를 계산하는 것과 같은 것과 같은 방법으로 수 있습니다, 특히 이식 가능한 코드의 경우 더 복잡합니다. 디스 어셈블리에서 값을 읽는 것이 IMO가 더 있습니다.)
아니요, C ++에는 명시적인 재귀 깊이가 없습니다. 최대 스택 크기를 초과하면 (Windows에서는 기본적으로 1MB) C ++ 프로그램이 스택을 오버플로하고 실행이 종료됩니다.
C or C ++ 표준에는 재귀 깊이 추적이나 제한이 없습니다. 실행시 깊이는 스택이 얼마나 커질 수 있는지에 따라 제한됩니다.
C ++에는 스택에 의해 제한되는 최대 재귀 깊이가 있습니다. 그러나 최신 운영 체제는 사용자 공간 스택이 채워지면 동적으로 확장 할 수 있으므로 메모리 공간 및 메모리 조각화에만 재귀 깊이가 제한됩니다.
한계는 플랫폼에서 사용할 수있는 스택의 크기라고 생각합니다. 내가 읽은 바에 따르면
Linux에서 기본적으로
8K
8MB이지만 최신 스택 크기를 동적으로 사용할 수 있습니다.
Python에서는 재귀 호출에 대해 조정 가능한 제한이 있습니다. C ++는 스택 크기에 의해 제한됩니다.
또한 많은 언어 또는 컴파일러는 추가 스택 공간이 사용하지 않도록 호출자의 스택 프레임을 제거하여 꼬리 재귀를 최적화 할 수 있습니다. (꼬리 재귀에서 호출 함수가 수행하는 유일한 작업은 재귀 호출을 수행 한 후 재귀 호출의 반환 값을 반환하는 것입니다.)
int fact(int n, int accum=1){
if (n==0) return accum;
else return fact(n-1,n*accum); //tail recursion here.
}
용어는 꼬리 재귀를 최적화하지 않습니다. (하지만 스택이없는 능숙한 은 그렇습니다 ). C ++는 꼬리 재귀 최적화를 필요로하지 않지만, 저는 gcc가 꼬리 재귀를 최적화 믿습니다. JVM은 꼬리 재귀를 최적화하지 않지만 Scala 언어는 특정 일반적인 문서화 사례에서 수행합니다. Scheme 및 Lisp (및 아마도 다른 기능적 언어)는 꼬리 재귀를 최적화해야합니다.
참조 URL : https://stackoverflow.com/questions/2630054/does-c-limit-recursion-depth
'ProgramingTip' 카테고리의 다른 글
Visual Studio에서 자동 개요 (0) | 2021.01.07 |
---|---|
ElementTree 노드 부모 노드에 액세스 (0) | 2021.01.07 |
CUDA는 재귀를 지원합니까? (0) | 2021.01.07 |
예외 발생없이 우수한 스택 추적 인쇄 (0) | 2021.01.07 |
node.js 소스 파일을 이용하는 방법이 있습니까? (0) | 2021.01.07 |