Как именно работает callstack?



я пытаюсь получить более глубокое понимание того, как работают низкоуровневые операции языков программирования и особенно как они взаимодействуют с ОС/процессором. Я, вероятно, прочитал каждый ответ в каждом потоке, связанном со стеком/кучей, здесь на Stack Overflow, и все они блестящие. Но есть еще одна вещь, которую я еще не до конца понял.



рассмотрим эту функцию в псевдокоде, который имеет тенденцию быть действительным кодом ржавчины; -)



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, но это будет означать, что ОС/процессора (?) должен выскочить 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 происходит.



эти два случая заставляют меня думать, что я не совсем понял, как ровно стек работает и как он строго следует ЛИФО правила.

877   0  

Comments

    Ничего не найдено.