Rumah > pembangunan bahagian belakang > C++ > Adakah Pengkompil C/C Menggunakan Arahan Tekan/Pop untuk Penciptaan Pembolehubah Setempat?

Adakah Pengkompil C/C Menggunakan Arahan Tekan/Pop untuk Penciptaan Pembolehubah Setempat?

Mary-Kate Olsen
Lepaskan: 2024-12-09 11:58:10
asal
245 orang telah melayarinya

Do C/C   Compilers Utilize Push/Pop Instructions for Local Variable Creation?

Penyusun C/C dengan Arahan Tekan/Pop untuk Pembolehubah Setempat

Pengenalan

Penyusun C/C tradisional mencipta pembolehubah tempatan dengan meningkatkan penuding tindanan (ESP) sekali. Walau bagaimanapun, menggunakan arahan push/pop boleh menghasilkan kod yang lebih padat dan berkemungkinan lebih pantas. Artikel ini meneroka penyusun mana yang menawarkan pengoptimuman ini.

Sokongan Pengkompil

Penyelidikan menunjukkan bahawa semua empat penyusun x86 utama (GCC, Clang, ICC dan MSVC) tidak menggunakan push/ arahan pop untuk mencipta pembolehubah tempatan. Sebaliknya, mereka lebih suka variasi kaedah lama, menggunakan sub rsp, c untuk mengurangkan penuding tindanan.

Kelebihan Tekan/Pop

Menggunakan tekan/pop untuk pembolehubah setempat menawarkan beberapa kelebihan:

  • Pengurangan saiz kod: Arahan tolak hanya 2 bait berbanding 9-11 bait untuk pasangan sub/mov.
  • Potensi peningkatan prestasi: Pada CPU dengan enjin tindanan, operasi tolak mungkin mengalami lebih sedikit uops segerak tindanan daripada sub rsp, menjadikan ia lebih pantas dalam senario tertentu.

Bila Perlu Dielakkan Push/Pop

Walaupun push/pop boleh memberi manfaat, ia tidak disyorkan dalam semua kes. Sebagai contoh, ia boleh menyebabkan uops penyegerakan tindanan tambahan apabila dicampur dengan mod pengalamatan [rsp x].

Kes Penggunaan Praktikal

Pertimbangkan fungsi berikut:

1

2

3

4

5

6

int extfunc(int *,int *);

 

void foo() {

    int a=1, b=2;

    extfunc(&a, &b);

}

Salin selepas log masuk

Kompilasi yang lebih baik menggunakan push/pop:

1

2

3

4

5

6

7

8

9

# compiled for the x86-64 System V calling convention:

# integer args in rdi, rsi  (,rdx, rcx, r8, r9)

    push    2                   # only 2 bytes

    lea     rdi, [rsp + 4]

    mov     dword ptr [rdi], 1

    mov     rsi, rsp                # special case for lea rsi, [rsp + 0]

    call    extfunc(int*, int*)

    pop     rax                   # alternative to add rsp,8

    ret

Salin selepas log masuk

Nota: Contoh ini mengoptimumkan kekompakan dan kelajuan dengan bertindih 4 bait terakhir arahan tolak dengan 4 bait pertama arahan lea .

Kesimpulan

Walaupun arahan tolak/pop boleh menawarkan saiz kod dan kelebihan prestasi untuk mencipta pembolehubah tempatan, ia tidak digunakan pada masa ini oleh penyusun C/C arus perdana. Ini mungkin disebabkan oleh potensi untuk uops penyegerakan tindanan tambahan dan kerumitan dalam menguruskan pengimbangan tindanan. Walau bagaimanapun, apabila pengoptimuman perkakasan dan pengkompil berkembang, ada kemungkinan push/pop untuk pembolehubah tempatan boleh digunakan secara meluas pada masa hadapan.

Atas ialah kandungan terperinci Adakah Pengkompil C/C Menggunakan Arahan Tekan/Pop untuk Penciptaan Pembolehubah Setempat?. 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