Rumah >pembangunan bahagian belakang >C++ >Adakah Fungsi Distinct C Sentiasa Mempunyai Alamat Penunjuk Fungsi Distinct?

Adakah Fungsi Distinct C Sentiasa Mempunyai Alamat Penunjuk Fungsi Distinct?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-01 22:39:19577semak imbas

Do Distinct C   Functions Always Have Distinct Function Pointer Addresses?

Kesamaan Penunjuk Fungsi dan Alamat Terbeza

Soalan:

Dalam C , ialah penunjuk fungsi untuk fungsi yang berbeza dijamin mempunyai alamat yang berbeza? Khususnya, untuk kod berikut:

void foo() {}
void bar() {}

template<class T> void foo() { }

Adakah &foo != &bar dan &foo != &foo dijamin benar?

Jawapan:

Standard tidak secara eksplisit memerlukan penunjuk fungsi untuk fungsi yang berbeza mempunyai alamat yang berbeza. Walau bagaimanapun, ia membenarkan pelaksanaan mengoptimumkan fungsi dengan takrifan yang sama, dan pengoptimuman ini boleh menghasilkan alamat fungsi yang sama.

Malah, Microsoft Visual C (MSVC) secara agresif melipat fungsi dengan pelaksanaan yang sama, memberikan mereka alamat yang sama . Tingkah laku ini dianggap tidak mematuhi.

Sebaliknya, pemaut Emas menawarkan tetapan yang lebih selamat yang mengekalkan alamat yang berbeza untuk fungsi, walaupun ia mempunyai takrifan yang sama.

Terperinci Penjelasan:

Piawaian C mentakrifkan kesamaan untuk penunjuk fungsi sebagai berikut:

  • Dua penunjuk fungsi membandingkan sama jika ia menunjuk kepada fungsi yang sama.
  • Sebagai alternatif, jika kedua-dua penunjuk fungsi mewakili alamat yang sama, ia juga dianggap sama.

Syarat terakhir memberikan latitud untuk pelaksanaan kepada alias fungsi yang berbeza dan tidak secara eksplisit memerlukan penunjuk kepada fungsi yang berbeza untuk menjadi tidak sama.

Walau bagaimanapun, mengambil alamat fungsi adalah tingkah laku yang boleh diperhatikan dan menukar alamat boleh melanggar peraturan "seolah-olah". Peraturan ini menghendaki bahawa kelakuan pelaksanaan tidak dapat dibezakan daripada kelakuan yang dinyatakan dalam piawaian.

Oleh itu, walaupun piawaian itu tidak secara eksplisit melarang pengaliasan alamat fungsi, ia boleh dipertikaikan bahawa ia melanggar peraturan "seolah-olah" , membawa kepada ketidakakuran tingkah laku.

Pemerhatian:

  • Menukar alamat fungsi boleh mengganggu program yang bergantung pada alamat fungsi unik, seperti yang menggunakan penunjuk fungsi sebagai nilai unik.
  • Sesetengah pemaut, termasuk Gold dan LLVM's lld, melakukan pengoptimuman yang mengelakkan pengalian alamat bermasalah hanya apabila perlu.

Kesimpulan:

Walaupun piawaian membenarkan pengaliasan alamat fungsi, secara amnya disyorkan untuk mengelakkan pengoptimuman ini kerana ia boleh mewujudkan isu mudah alih dan kebolehpercayaan .

Atas ialah kandungan terperinci Adakah Fungsi Distinct C Sentiasa Mempunyai Alamat Penunjuk Fungsi Distinct?. 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