Pemrogram mungkin memiliki pertanyaan tentang susunan bingkai bukan dalam istilah luas (bahwa itu adalah entitas menghanguskan dalam tumpukan yang hanya melayani satu panggilan fungsi dan menyimpan alamat pengirim, argumen dan variabel lokal) tetapi dalam arti yang sempit - ketika istilah stack frames
tersebut disebutkan dalam konteks opsi kompiler.
Apakah penulis pertanyaan bermaksud atau tidak, tetapi konsep bingkai tumpukan dari aspek opsi kompiler adalah masalah yang sangat penting, tidak dicakup oleh balasan lain di sini.
Sebagai contoh, kompiler Microsoft Visual Studio 2015 C / C ++ memiliki opsi berikut yang berkaitan dengan stack frames
:
- / Oy (Penghilangan Frame-Pointer)
GCC memiliki yang berikut:
- -fomit-frame-pointer (Jangan simpan frame pointer dalam register untuk fungsi yang tidak membutuhkannya. Ini menghindari instruksi untuk menyimpan, mengatur dan mengembalikan frame pointer; itu juga membuat register tambahan tersedia di banyak fungsi )
Intel C ++ Compiler memiliki yang berikut:
- -fomit-frame-pointer (Menentukan apakah EBP digunakan sebagai register tujuan umum dalam optimasi)
yang memiliki alias berikut:
Delphi memiliki opsi baris perintah berikut:
- - $ W + (Generate Stack Frames)
Dalam arti tertentu, dari perspektif kompiler, bingkai tumpukan hanyalah kode masuk dan keluar untuk rutin , yang mendorong jangkar ke tumpukan - yang juga dapat digunakan untuk debugging dan untuk penanganan pengecualian. Alat debugging dapat memindai data tumpukan dan menggunakan jangkar ini untuk penelusuran balik, saat mencari call sites
di tumpukan, yaitu untuk menampilkan nama fungsi dalam urutan yang disebut hierarki. Untuk arsitektur Intel, itu push ebp; mov ebp, esp
atau enter
untuk masuk danmov esp, ebp; pop ebp
atauleave
untuk keluar.
Itu sebabnya sangat penting untuk memahami bagi seorang programmer apa itu stack frame ketika datang ke opsi kompiler - karena kompiler dapat mengontrol apakah akan menghasilkan kode ini atau tidak.
Dalam beberapa kasus, frame tumpukan (kode masuk dan keluar untuk rutin) dapat dihilangkan oleh kompiler, dan variabel akan langsung diakses melalui penunjuk tumpukan (SP / ESP / RSP) daripada penunjuk basis yang nyaman (BP / ESP / RSP). Ketentuan untuk penghilangan bingkai tumpukan, misalnya:
- fungsi adalah fungsi daun (yaitu entitas akhir yang tidak memanggil fungsi lain);
- tidak ada coba / akhirnya atau coba / kecuali atau konstruksi serupa, yaitu tidak ada pengecualian yang digunakan;
- tidak ada rutin yang dipanggil dengan parameter keluar pada stack;
- fungsi tidak memiliki parameter;
- fungsi tidak memiliki kode rakitan inline;
- dll ...
Menghilangkan frame stack (entri dan kode keluar untuk rutin) dapat membuat kode lebih kecil dan lebih cepat, tetapi juga dapat secara negatif mempengaruhi kemampuan debuggers untuk melacak kembali data dalam stack dan untuk menampilkannya ke programmer. Ini adalah opsi kompiler yang menentukan di bawah kondisi mana suatu fungsi harus memiliki kode masuk dan keluar, misalnya: (a) selalu, (b) tidak pernah, (c) saat diperlukan (menentukan kondisi).