Rumah >pembangunan bahagian belakang >C++ >Mengapa Fungsi `f` Menolak RAX ke Tindanan Sebelum Operasi Lain?
Penjajaran Tindanan Panggilan Fungsi
Dalam kod pemasangan yang disediakan, mungkin membingungkan untuk melihat RAX ditolak ke tindanan sebagai operasi pertama dalam fungsi f. Memahami alasan di sebalik tindakan ini memerlukan pemeriksaan ABI 64-bit.
ABI 64-bit memberi mandat bahawa timbunan diselaraskan 16-bait sebelum arahan panggilan. Walau bagaimanapun, arahan panggilan menolak alamat pemulangan 8-bait ke tindanan, mengganggu penjajaran ini. Akibatnya, pengkompil bertanggungjawab melaksanakan langkah untuk menjajarkan semula tindanan kepada gandaan 16 sebelum meneruskan ke panggilan seterusnya.
Dalam konteks ini, menolak nilai tidak peduli, seperti RAX, berfungsi tujuan yang cekap. Ia menyediakan cara untuk menjajarkan tindanan tanpa menanggung overhed melaksanakan arahan sub rsp, 8 tambahan, yang mungkin kurang cekap pada CPU yang dilengkapi dengan enjin tindanan.
Perbandingan dengan tailcall tanpa std: :pembungkus fungsi menggambarkan prinsip ini. Dalam fungsi remeh g, pengkompil hanya boleh melaksanakan arahan jmp tanpa sebarang tindakan penjajaran tindanan sebelumnya. Walau bagaimanapun, dalam kes f, tolakan tambahan RAX diperlukan untuk mengekalkan penjajaran 16 bait, memastikan keserasian dengan keperluan ABI.
Atas ialah kandungan terperinci Mengapa Fungsi `f` Menolak RAX ke Tindanan Sebelum Operasi Lain?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!