Saya mencoba untuk mendapatkan pemahaman yang lebih dalam tentang bagaimana operasi bahasa pemrograman tingkat rendah bekerja dan terutama bagaimana mereka berinteraksi dengan OS / CPU. Saya mungkin telah membaca setiap jawaban di setiap utas terkait tumpukan / tumpukan di sini di Stack Overflow, dan semuanya brilian. Tapi masih ada satu hal yang belum saya mengerti sepenuhnya.
Pertimbangkan fungsi ini dalam kode semu yang cenderung merupakan kode Rust yang valid ;-)
fn foo() {
let a = 1;
let b = 2;
let c = 3;
let d = 4;
// line X
doSomething(a, b);
doAnotherThing(c, d);
}
Beginilah cara saya mengasumsikan tumpukan terlihat pada baris X:
Stack
a +-------------+
| 1 |
b +-------------+
| 2 |
c +-------------+
| 3 |
d +-------------+
| 4 |
+-------------+
Sekarang, semua yang saya baca tentang cara kerja tumpukan adalah bahwa ia secara ketat mematuhi aturan LIFO (terakhir masuk, keluar pertama). Sama seperti tipe data tumpukan di .NET, Java atau bahasa pemrograman lainnya.
Tetapi jika itu masalahnya, lalu apa yang terjadi setelah baris X? Karena jelas, hal berikutnya yang kita perlukan adalah bekerja dengan a
dan b
, tetapi itu berarti OS / CPU (?) Harus keluar d
dan c
pertama kembali ke a
dan b
. Tapi kemudian ia akan menembak dirinya sendiri di kaki, karena ia membutuhkan c
dan d
di baris berikutnya.
Jadi, saya bertanya-tanya apa sebenarnya yang terjadi di balik layar?
Pertanyaan terkait lainnya. Pertimbangkan kami meneruskan referensi ke salah satu fungsi lain seperti ini:
fn foo() {
let a = 1;
let b = 2;
let c = 3;
let d = 4;
// line X
doSomething(&a, &b);
doAnotherThing(c, d);
}
Dari cara saya memahami berbagai hal, ini berarti bahwa parameter di doSomething
pada dasarnya menunjuk ke alamat memori yang sama seperti a
dan b
di foo
. Tetapi sekali lagi ini berarti bahwa tidak ada munculan tumpukan sampai kita sampai a
danb
terjadi.
Kedua kasus itu membuat saya berpikir bahwa saya belum sepenuhnya memahami bagaimana tepatnya tumpukan bekerja dan bagaimana itu secara ketat mengikuti aturan LIFO .
LIFO
artinya Anda dapat menambah atau menghapus elemen hanya di akhir tumpukan, dan Anda selalu dapat membaca / mengubah elemen apa pun.