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!