Rumah >pembangunan bahagian belakang >C++ >Bolehkah Fungsi Distinct C Mempunyai Alamat yang Sama?

Bolehkah Fungsi Distinct C Mempunyai Alamat yang Sama?

Patricia Arquette
Patricia Arquetteasal
2024-12-08 03:34:11449semak imbas

Can Distinct C   Functions Have the Same Address?

Kesamaan Penunjuk Fungsi dan Penggabungjalinan Fungsi

Soalan:

Bolehkah fungsi yang berbeza mempunyai yang sama alamat? Sebagai contoh, adakah &foo dan &bar dijamin tidak sama rata dan &foo dan &foo dijamin berbeza?

Jawapan:

Piawaian C membenarkan pelaksanaan mengoptimumkan fungsi dengan takrifan yang sama dan menggabungkannya menjadi satu fungsi. Ini bermakna alamat dua fungsi sedemikian mungkin tidak berbeza.

Pematuhan Standard:

Laporan kecacatan 1400 mengenai kesamaan penunjuk fungsi mengakui pengoptimuman ini tetapi mencadangkan bahawa ia tidak jelas sama ada piawaian itu perlu menanganinya secara eksplisit. Maklum balas daripada jawatankuasa menyatakan bahawa pelaksanaan adalah bebas untuk dioptimumkan dalam kekangan peraturan "seolah-olah".

Peraturan "Seolah-Seolah":

Di bawah peraturan "seolah-olah", pelaksanaan boleh meniru tingkah laku yang boleh diperhatikan tanpa mematuhi butiran pelaksanaan tertentu. Memandangkan alamat fungsi tidak secara eksplisit diperlukan untuk dibezakan, pengoptimuman ini tidak melanggar peraturan.

Operator Kesaksamaan:

Menurut seksyen 5.10 standard, dua penunjuk membandingkan sama jika kedua-duanya nol, menunjuk ke fungsi yang sama, atau mewakili alamat yang sama. Ini membenarkan pelaksanaan untuk menetapkan alamat yang sama kepada dua fungsi jika ia mempunyai takrifan yang sama.

Pemerhatian:

Keith Thompson menyatakan bahawa mencetak hasil &foo == &bar ialah tingkah laku yang boleh diperhatikan. Menukar gelagat yang boleh diperhatikan dengan menggabungkan fungsi berkemungkinan memecahkan program sedemikian.

Selain itu, makro seperti SIG_DFL dan SIG_ERR dalam diperlukan untuk menjana nilai berbeza yang membandingkan tidak sama dengan alamat mana-mana fungsi yang boleh diisytiharkan. Ini menunjukkan bahawa fungsi dengan alamat yang sama akan melanggar keperluan ini.

Pengoptimuman Antara Prosedur:

Jan Hubička, pembangun GCC, mengesahkan bahawa melipat fungsi yang sama dengan alamat yang sama ialah tingkah laku tidak mematuhi. Ia memecahkan bahagian tertentu kod pengepala GCC yang telah dikompilasi yang bergantung pada perbandingan alamat.

Kesimpulan:

Walaupun piawaian tidak secara eksplisit melarang pengoptimuman penggabungan fungsi yang serupa, ia adalah penting untuk mempertimbangkan potensi kesan pada kod yang bergantung pada alamat fungsi yang berbeza. Pelaksanaan harus mendekati pengoptimuman ini dengan berhati-hati dan mengelakkannya dalam kes di mana tingkah laku yang boleh diperhatikan akan terjejas.

Atas ialah kandungan terperinci Bolehkah Fungsi Distinct C Mempunyai Alamat yang Sama?. 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