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 adan b, tetapi itu berarti OS / CPU (?) Harus keluar ddan cpertama kembali ke adan b. Tapi kemudian ia akan menembak dirinya sendiri di kaki, karena ia membutuhkan cdan ddi 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 doSomethingpada dasarnya menunjuk ke alamat memori yang sama seperti adan bdi foo. Tetapi sekali lagi ini berarti bahwa tidak ada munculan tumpukan sampai kita sampai adanb terjadi.
Kedua kasus itu membuat saya berpikir bahwa saya belum sepenuhnya memahami bagaimana tepatnya tumpukan bekerja dan bagaimana itu secara ketat mengikuti aturan LIFO .
LIFOartinya Anda dapat menambah atau menghapus elemen hanya di akhir tumpukan, dan Anda selalu dapat membaca / mengubah elemen apa pun.





