2010-03-26 6 views
3

내가 C의 생각을 읽고 있어요 ++ (2 권.) 함수가 호출 될 때마다함수의 정적 및 동적 부모

, 그 기능에 대한 정보는 는 활성화에 런타임 스택으로 푸시됩니다 레코드 인스턴스 (ARI), 도 스택 프레임이라고합니다. 일반적인 스택 프레임에 포함 된 (1)는 호출 함수의 주소 (그래서 실행 수 그것에 창) 함수의 정적 부모합니다 ( 범위의 ARI에, (2) 포인터는 사 전적으로 불리는 포함하는 함수이기 때문에 함수에 대한 전역 변수 에 액세스 할 수 있음) 및 (3) (동적 부모)이라는 함수에 대한 포인터. 논리적으로 반복적으로 동적 상위 링크를 다음의 결과 경로는 내가 저자는 함수의 정적 및 동적 부모로서 무엇을 의미하는지 이해할 수 없어요 동적 체인 또는 호출 체인

입니다. 또한 항목 1, 2 또는 3을 구분할 수 없습니다. 모두 동일하게 보입니다. 누군가 나에게이 구절을 설명해 주시겠습니까?

+0

호출자 및 피 호출자. 또한 호출 수신자가 반환되면 호출 스택이 한 번 (풀리지 않음) 표시되고 프레임 포인터가 감소하여 부모 함수 (호출자)를 가리킨다는 것을 알고 있습니다. – legends2k

답변

2

이 모든 소리가 저에게 이상하게 들립니다. 정적 프레임 포인터는 일반적으로 기능적 언어와 같은 어휘 범위가있는 언어와 중첩 된 함수가있는 파스칼 패밀리에서 사용됩니다. 전역은 컴파일 타임이나 런타임에서 바인딩되므로 프레임 포인터가 필요하지 않습니다. (1)은 유효하지만 (2) C++, AFAIK에는 존재하지 않습니다.

나는 (3)이 (가) 부모 프레임 포인터를 의미한다고 생각합니다. 호출 스택은 일반적으로 링크 된 목록으로 설정되므로 디버거와 관련 도구가 프로그램에 대한 심층적 인 지식 없이도 호출 할 수 있습니다.

4

이 문장은 C++에 관한 것이 아니라 스택 프레임의 일반적인 구조라고 생각합니다. 1)은 복귀 주소 - 주 기능의 call 이후의 명령어 주소입니다. 반환이 수행되면 스택에서 pop이 실행되고 실행은 해당 지점으로 이동합니다 (C++의 경우 유효) 2) 및 3)은 중첩 된 함수를 허용하는 언어에 대해 유효합니다. (함수 내부에서 선언 된 함수)와 같은 함수는 부모의 변수에 액세스 할 수 있으므로 부모의 스택 프레임에 대한 링크 (정적 링크)가 있으며 동적 링크는이 함수가 재귀 적으로 호출 할 수 있도록합니다.