Memahami Kepelbagaian Konvensyen Panggilan dalam C/C
C/C menyediakan pelbagai konvensyen panggilan, masing-masing dengan ciri dan implikasi yang berbeza untuk panggilan fungsi. Konvensyen ini menentukan cara hujah dihantar kepada fungsi dan cara nilai pulangan dikendalikan.
Konvensyen Panggilan yang Tersedia
Konvensyen panggilan utama yang tersedia dalam C/C ialah:
-
cdecl: Hujah ditolak ke tindanan dari kanan ke kiri, dengan daftar disimpan pemanggil (EAX, ECX, EDX) dan daftar disimpan pemanggil (penunjuk tindanan dan selebihnya).
-
syscall: Serupa dengan cdecl, tetapi dengan EAX, ECX dan EDX tidak dipelihara. Saiz senarai parameter dihantar dalam AL.
-
pascal: Argumen ditolak ke tindanan kiri-ke-kanan, dan penerima bertanggungjawab untuk mengimbangi tindanan.
-
stdcall: Variasi pascal di mana penerima bertanggungjawab untuk pembersihan tindanan tetapi parameter ditolak ke tindanan kanan ke kiri. EAX, ECX dan EDX ditetapkan untuk digunakan dalam fungsi.
-
panggilan pantas: Melewati dua argumen pertama ke dalam daftar ECX dan EDX, dan baki argumen ke tindanan dari kanan ke kiri .
Panggilan Lanjutan Konvensyen
Selain konvensyen standard ini, terdapat varian khusus:
-
vectorcall: Lulus hujah vektor menggunakan daftar SIMD, melanjutkan sokongan untuk lulus nilai agregat vektor homogen.
-
panggilan selamat: Merangkumkan pengendalian ralat COM, dengan pengecualian yang dihantar semula sebagai HResult dalam EAX dan keputusan diluluskan melalui rujukan pada tindanan.
-
Konvensyen Panggilan Microsoft X64: Menggunakan daftar khusus untuk integer dan argumen titik terapung, dengan hujah tambahan ditolak ke timbunan. Pemanggil bertanggungjawab untuk memperuntukkan "ruang bayangan" pada tindanan.
Memilih Konvensyen yang Tepat
Konvensyen panggilan yang sesuai bergantung pada platform tertentu, pengkompil , dan keperluan permohonan. Pertimbangkan faktor seperti kiraan parameter, penggunaan daftar dan pengoptimuman prestasi apabila memilih konvensyen panggilan.
Sebagai contoh, stdcall biasanya digunakan untuk memanggil fungsi Windows API, manakala cdecl sering digunakan dalam persekitaran seperti Unix. fastcall mungkin menawarkan prestasi yang lebih pantas untuk fungsi dengan beberapa parameter.
Sumber Tambahan
- [Microsoft Docs: Calling Conventions](https://docs.microsoft. com/en-us/cpp/build/x64-calling-convention)
- [Wikipedia: Memanggil Konvensyen](https://en.wikipedia.org/wiki/Calling_convention)
Atas ialah kandungan terperinci Bagaimanakah Konvensyen Panggilan Berbeza Memberi Impak Fungsi Panggilan dalam C/C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!