Rumah >pembangunan bahagian belakang >C++ >Mengapakah RAX Ditolak ke Tindanan Sebelum Panggilan Ekor dengan `std::function`?

Mengapakah RAX Ditolak ke Tindanan Sebelum Panggilan Ekor dengan `std::function`?

Susan Sarandon
Susan Sarandonasal
2024-12-13 01:11:16176semak imbas

Why is RAX Pushed onto the Stack Before a Tail Call with a `std::function`?

Mengapa RAX Ditolak ke Tindanan Sebelum Panggilan Ekor?

Output pemasangan untuk fungsi f mengambil argumen fungsi std:: mendedahkan operasi yang menarik: sejurus sebelum panggilan ekor, RAX ditolak ke timbunan. Tingkah laku ini tidak diperhatikan dalam panggilan ekor ringkas tanpa pembungkus fungsi std::.

Pertimbangan Penjajaran

Sebab menolak RAX adalah berakar umbi dalam 64-bit ABI, yang memerlukan timbunan dijajarkan kepada 16 bait sebelum arahan panggilan. Arahan panggilan menolak alamat pemulangan 8-bait ke tindanan, melanggar penjajaran. Untuk membetulkannya, pengkompil mesti menjajarkan semula tindanan kepada gandaan 16 bait sebelum panggilan ekor.

Penjajaran Tindanan yang Cekap

Menolak nilai tidak peduli seperti RAX ialah cara yang cekap untuk mencapai penjajaran tindanan kerana:

  • Enjin tindanan pada sesetengah CPU boleh mengoptimumkan operasi berbanding sub rsp, 8.
  • Nilai yang ditolak ke tindanan adalah tidak relevan kerana ia tidak digunakan dalam fungsi.

Dengan menolak RAX, pengkompil memenuhi keperluan penjajaran tanpa mengganggu kelakuan fungsi.

Atas ialah kandungan terperinci Mengapakah RAX Ditolak ke Tindanan Sebelum Panggilan Ekor dengan `std::function`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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