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
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
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!