스택은 상향식 더미입니다.
따라서 스택이 비워지고 프로그램이 종료 될 때까지 각 함수가 종료 될 때 항목이 스택에서 제거 된 상태에서 함수가 호출되면 호출 스택이 스택에 새 항목을 추가합니다.
위의 내용이 올 바르면 사람들이 콜 스택을 "위로"이동하는 것을 제어하는 이유는 무엇입니까? 확실히 제어 하면 통화 스택이 맨 아래에 도달 할 때까지 아래로 이동 합니다 .
스택은 상향식 더미입니다.
따라서 스택이 비워지고 프로그램이 종료 될 때까지 각 함수가 종료 될 때 항목이 스택에서 제거 된 상태에서 함수가 호출되면 호출 스택이 스택에 새 항목을 추가합니다.
위의 내용이 올 바르면 사람들이 콜 스택을 "위로"이동하는 것을 제어하는 이유는 무엇입니까? 확실히 제어 하면 통화 스택이 맨 아래에 도달 할 때까지 아래로 이동 합니다 .
답변:
이 사용법에는 두 가지 가능한 이유가 있습니다.
예외 상황에서 컨트롤은 호출 함수 / 메서드로 이동하며,이 호출 계층 구조는 일반적으로 main 메소드가 맨 위에 표시되고 메소드 호출이 계층 레벨을 아래로 형성하며 추상화 레벨이 감소합니다. 이 계층에서는 예외가 위로 이동합니다.
일반 x86 응용 프로그램의 실제 프로그램 스택은 거꾸로됩니다. 즉 아래쪽으로 커집니다. 푸시 / PUSHW / PUSHD 기계 코드 명령어는 감소 스택 포인터를. 다른 아키텍처도이 모델을 공유 할 수 있습니다.
그것은 모두 단어의 정의에 달려 있습니다. 이 문맥에서 "상단"과 "하단"이라는 단어와 운영 체제 또는 컴퓨터 아키텍처의 구현에서 정확히 무엇을 의미합니까?
Commodore 64에서 프로그래밍 할 때 오래 전부터 다음을 기억합니다. 주소 $ 0800 (2048)과 $ 9FFF (40959) 사이의 메모리는 BASIC 프로그램 용으로 예약되었습니다. BASIC 프로그램의 코드는 더 낮은 주소에서 시작하여 저장되었습니다 ($ 800). 서브 루틴의 변수 및 리턴 주소를 저장하기위한 스택은 해당 범위의 최상위 ($ 9FFF)에서 시작하여 더 낮은 주소로 커졌습니다. 따라서이 문맥에서 스택이 아래로 커지는 것을 보는 것이 논리적이며, 서브 루틴에서 돌아 왔을 때 스택 포인터를 증가시켜 서브 루틴의 스택 프레임을 버렸습니다. 서브 루틴에서 복귀
Windows 또는 Intel x86 프로세서와 같은 최신 버전에서 어떻게 작동하는지 모르겠습니다. 스택은 다른 방식으로 작동 할 수 있습니다. 즉, 낮은 주소에서 높은 주소로 증가합니다. 이 경우 "top", "bottom"및 "up", "down"이라는 단어를 정확히 다른 방식으로 사용합니다.
foo (6, x + 1)과 같은 함수를 호출하려면 ...
- 호출자의 컨텍스트에서 x + 1과 같은 실제 매개 변수 표현식을 평가하십시오.
- 적절한 "로컬 블록"메모리를이 목적 전용 런타임 "호출 스택"으로 푸시하여 foo () 로컬에 메모리를 할당하십시오. 로컬 변수가 아닌 매개 변수의 경우 (1) 단계의 값을 foo () 로컬 블록의 해당 슬롯에 저장하십시오.
- 호출자의 현재 실행 주소 ( "반환 주소")를 저장하고 실행을 foo ()로 전환하십시오.
- foo ()는 호출 스택 끝에서 편리하게 사용할 수있는 로컬 블록으로 실행됩니다.
- foo ()가 완료되면 스택에서 로컬을 팝하여 종료하고 이전에 저장된 리턴 주소를 사용하여 호출자에게 "반환"합니다. 이제 호출자의 로컬은 스택의 끝에 있으며 실행을 재개 할 수 있습니다.
참고:
http://cslibrary.stanford.edu/102/PointersAndMemory.pdf (p15)
일반 중력 현실에서 테니스 공이 들어있는 실린더와 같이 스택을 상향식으로 개념화하면 함수가 호출 될 때 컨트롤이 스택 위로 올라갑니다. 기능이 완료되면 제어 장치가 스택 아래로 이동합니다.
스택을 테니스 공의 동일한 실린더와 같지만 중력이 거꾸로 된 하향식으로 개념화하면 함수가 호출되면 제어가 스택을 위로 이동하고 함수가 완료되면 스택을 위로 이동합니다.
이것들은 모두 머리 속에있는 모델 일 뿐이며 본질적으로 완전히 임의적입니다. 원한다면 그것을 일대일로 개념화 할 수 있지만 사람들과 의사 소통하는 데 어려움이있을 수 있습니다. 나는 개인적으로 A가 B를 호출하고 B가 C를 호출하면 C가 스택의 맨 아래 (반전 된 중력 현실)이고 C에서 예외가 발생하면 그 예외를 A까지 버블 링하고 싶다고 생각합니다. C가 깊고 A가 최상위라는 느낌이 들기 때문에보다 일반적인 언어 사용법. 첫 번째 기능은 더 직관적으로 나에게 가장 적합하며 각 호출에서 기능이 더 깊어집니다.