Rumah >pembangunan bahagian belakang >C++ >Adakah Penyusun C/C Moden Menggunakan Arahan Push/Pop untuk Pengurusan Pembolehubah Tempatan yang Cekap?

Adakah Penyusun C/C Moden Menggunakan Arahan Push/Pop untuk Pengurusan Pembolehubah Tempatan yang Cekap?

Barbara Streisand
Barbara Streisandasal
2024-12-02 19:18:15559semak imbas

Do Modern C/C   Compilers Utilize Push/Pop Instructions for Efficient Local Variable Management?

Apakah Penyusun C/C Boleh Menggunakan Arahan Tekan/Pop untuk Mencipta Pembolehubah Setempat?

Pengenalan

Bertentangan dengan amalan biasa meningkatkan ESP secara berperingkat, soalan ini menyelidiki kemungkinan menggunakan arahan tolak dan pop untuk mewujudkan pembolehubah tempatan, bertujuan untuk mengoptimumkan kekompakan kod dan kemungkinan prestasi.

Pertimbangan Pengkompil

Pengoptimuman Pengkompil:

  • Kesemua empat penyusun x86 utama (GCC, ICC, MSVC, clang) telah meninggalkan dorongan untuk pengoptimuman.
  • Ini disebabkan terutamanya oleh penggunaan push yang tinggi pada CPU dahulu, yang memberi kesan negatif terhadap kecekapan teras super-skalar.
  • Walau bagaimanapun, moden penyusun telah memperkenalkan semula push/pop untuk peningkatan prestasi, terutamanya dalam manipulasi hujah tindanan dan dipelihara panggilan mendaftar.

Pengoptimuman Enjin Tindanan:

  • CPU terkini seperti Intel sejak Pentium-M dan AMD sejak Jentolak menggabungkan "enjin tindanan" yang menjejaki Pengubahsuaian RSP dengan cekap.
  • Ciri ini membolehkan penggunaan push/pop/call/ret tanpa dikenakan penalti prestasi.
  • Penggunaan push/pop secara berhati-hati boleh membawa kepada peningkatan prestasi dengan mengoptimumkan kelajuan dan bukannya saiz kod semata-mata.

Sampel Kod

Pertimbangkan perkara berikut contoh:

int extfunc(int *, int *);

void foo() {
    int a=1, b=2;
    extfunc(&a, &b);
}

Output Pengkompil

GCC, ICC, MSVC dan clang semuanya menjana kod yang bermula dengan arahan tolak, diikuti dengan manipulasi tindanan dan panggilan kepada extfunc. Ini sejajar dengan pemerhatian bahawa penyusun moden menggunakan dorongan untuk pengoptimuman.

Penyelesaian Optimum

Penyelesaian yang dioptimumkan selanjutnya ialah:

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

Dalam kes ini, arahan tolak tunggal memperuntukkan ruang untuk kedua-dua pembolehubah tempatan sambil meninggalkan timbunan 16-bait sejajar. Ini mengoptimumkan saiz kod dan mengekalkan kecekapan.

Pertimbangan Tambahan

  • Mencampurkan tolak dengan mod pengalamatan [rsp] boleh memperkenalkan uops penyegerakan tindanan tambahan pada CPU Intel, berpotensi mengurangkan kecekapan.
  • Penyusun biasanya mengelak daripada melaksanakan pengoptimuman ini kerana ia memerlukan pengiraan yang teliti dan mengimbangi pertukaran untuk mengelakkan kemerosotan prestasi.

Atas ialah kandungan terperinci Adakah Penyusun C/C Moden Menggunakan Arahan Push/Pop untuk Pengurusan Pembolehubah Tempatan yang Cekap?. 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