Rumah > pembangunan bahagian belakang > C++ > Mengapa Daftar RAX Ditolak ke Tindanan Semasa Panggilan Ekor dengan fungsi std::?

Mengapa Daftar RAX Ditolak ke Tindanan Semasa Panggilan Ekor dengan fungsi std::?

Mary-Kate Olsen
Lepaskan: 2024-12-12 19:07:10
asal
374 orang telah melayarinya

Why is the RAX Register Pushed onto the Stack During Tail Calls with std::function?

Penjajaran Timbunan dalam Situasi Tailcall

Timbul persoalan mengapa daftar RAX pertama kali ditolak ke timbunan dalam kod pemasangan yang dihasilkan untuk kod C yang berinteraksi dengan objek std::function.

Keperluan Penjajaran Tindanan

ABI 64-bit memberi mandat bahawa tindanan dijajarkan kepada 16 bait sebelum sebarang arahan panggilan. Apabila panggilan dibuat, ia menolak alamat pemulangan 8-bait ke dalam timbunan, mengganggu penjajaran ini. Untuk membetulkannya, pengkompil mesti mengambil langkah untuk menjajarkan semula tindanan kepada gandaan 16 sebelum panggilan seterusnya.

Menolak Nilai Boleh Guna untuk Penjajaran

Daripada melaksanakan "sub rsp, 8," menolak nilai "tidak peduli", seperti RAX, terbukti lebih cekap pada CPU yang dilengkapi dengan enjin tindanan. Ini kerana arahan tolak yang mudah selalunya memerlukan lebih sedikit overhed pemproses daripada arahan sub rsp, 8.

Perbandingan dengan Tailcall tanpa std::function Wrapper

Apabila ada tiada std::function wrapper hadir, seperti dalam contoh "void g(void (*a)())", tailcall adalah mudah: arahan lompat mudah (jmp) kepada fungsi sasaran. Tiada langkah tambahan diperlukan untuk penjajaran tindanan kerana panggilan ekor secara semula jadi akan mengekalkan penjajaran tindanan yang betul.

Atas ialah kandungan terperinci Mengapa Daftar RAX Ditolak ke Tindanan Semasa Panggilan Ekor dengan fungsi std::?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan