Rumah >pembangunan bahagian belakang >C++ >Adakah Fungsi Distinct C Sentiasa Mempunyai Alamat Penunjuk Fungsi Distinct?
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
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:
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:
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!