프로그래밍 언어의 저수준 작업이 어떻게 작동하는지, 특히 OS / CPU와 상호 작용하는 방법에 대해 더 깊이 이해하려고합니다. 나는 아마도 스택 오버플로의 모든 스택 / 힙 관련 스레드에서 모든 답변을 읽었으며 모두 훌륭합니다. 하지만 아직 완전히 이해하지 못한 것이 하나 있습니다.
유효한 Rust 코드 인 의사 코드에서이 함수를 고려하십시오 ;-)
fn foo() {
let a = 1;
let b = 2;
let c = 3;
let d = 4;
// line X
doSomething(a, b);
doAnotherThing(c, d);
}
이것이 내가 X 행에서 스택이 어떻게 보이는지 가정하는 방법입니다.
Stack
a +-------------+
| 1 |
b +-------------+
| 2 |
c +-------------+
| 3 |
d +-------------+
| 4 |
+-------------+
이제 스택이 작동하는 방식에 대해 읽은 모든 것은 LIFO 규칙을 엄격하게 준수한다는 것입니다 (후입 선출). .NET, Java 또는 기타 프로그래밍 언어의 스택 데이터 유형과 같습니다.
하지만 그럴 경우 X 행 뒤에 무슨 일이 일어날까요? 분명하기 때문에, 다음 일이 우리의 필요와 작업하는 것입니다 a
및 b
하지만은 OS / CPU가 (?) 튀어한다는 것을 의미 d
하고 c
처음으로 돌아 가야 a
하고 b
. 이 필요하기 때문에 그러나 그것은 발에 자신을 쏠 것 c
및 d
다음 줄에.
그래서 뒤에서 정확히 무슨 일이 일어나는지 궁금 합니다.
또 다른 관련 질문입니다. 다음과 같은 다른 함수 중 하나에 대한 참조를 전달한다고 가정합니다.
fn foo() {
let a = 1;
let b = 2;
let c = 3;
let d = 4;
// line X
doSomething(&a, &b);
doAnotherThing(c, d);
}
내가 일을 이해하는 방법에서, 이것은의 매개 변수는 것을 의미 doSomething
본질적으로 같은 동일한 메모리 주소를 가리키는 a
및 b
의 foo
. 하지만 다시이 방법이 더 있다는 것을 우리가 얻을 때까지 스택을 팝업하지 a
및b
일어날 .
이 두 가지 경우 는 스택이 정확히 작동하는 방식과 LIFO 규칙을 엄격하게 따르는 방식을 완전히 이해하지 못했다고 생각 하게합니다 .
LIFO
스택의 끝에 만 요소를 추가하거나 제거 할 수 있으며 항상 모든 요소를 읽고 / 변경할 수 있습니다.