Adakah Fungsi Berbeza Mempunyai Alamat Berbeza?
Dalam C , biasanya diandaikan bahawa fungsi dengan pelaksanaan berbeza mempunyai alamat yang berbeza. Walau bagaimanapun, ini mungkin tidak selalunya berlaku dalam senario tertentu.
Pengoptimuman Lipatan Fungsi
Pengoptimuman pengkompil mungkin menggunakan lipatan fungsi untuk menggabungkan fungsi dengan pelaksanaan yang sama menjadi satu entiti. Ini boleh menyebabkan fungsi berkongsi alamat yang sama.
Walaupun piawaian C membenarkan pelaksanaan melaksanakan pengoptimuman sedemikian, masih tidak jelas sama ada ia dibenarkan secara eksplisit untuk fungsi berkongsi alamat yang sama.
Peraturan Seolah-olah dan Tingkah Laku Yang Boleh Diperhatikan
Di bawah seakan-akan peraturan, pengkompil boleh mengoptimumkan kod jika tingkah laku yang boleh diperhatikan kekal tidak berubah. Mengambil alamat fungsi dianggap sebagai tingkah laku yang boleh diperhatikan.
Tafsiran Standard
Laporan kecacatan 1400 menangani isu ini dengan agak samar-samar. Ia mengakui bahawa pelaksanaan mungkin alias berfungsi tetapi membiarkan tafsiran tepat standard terbuka untuk dibahaskan.
Pemerhatian
Terdapat kebimbangan bahawa lipatan fungsi boleh memecahkan program yang bergantung pada alamat yang berbeza untuk fungsi. Sebagai contoh, menggunakan alamat fungsi sebagai pengecam unik boleh menjadi masalah jika ia dikongsi oleh berbilang fungsi.
Keperluan C11
Piawaian C11 memerlukan makro seperti SIG_DFL dan SIG_ERR untuk menjana nilai berbeza yang membandingkan tidak sama dengan mana-mana fungsi yang boleh diisytiharkan. Ini menunjukkan bahawa piawaian C melarang fungsi daripada mempunyai alamat yang sama.
Perkembangan Terkini
Pemaju gcc menjelaskan bahawa lipatan fungsi agresif MSVC melanggar standard. Selain itu, perbincangan llvm-dev menekankan bahawa pemaut yang lebih bijak mengelak daripada menggabungkan fungsi melainkan ia digunakan semata-mata untuk panggilan dan bukan untuk pemerhatian alamat.
Kesimpulan
Berdasarkan maklumat yang tersedia , masih tidak jelas sama ada piawaian C semasa secara eksplisit melarang atau membenarkan pengoptimuman lipatan fungsi yang terhasil dalam fungsi yang sama berkongsi alamat yang sama. Peraturan seolah-olah memberi kebebasan kepada penyusun untuk mengoptimumkan, tetapi tingkah laku yang boleh diperhatikan (mengambil alamat fungsi) harus kekal tidak terjejas. Walau bagaimanapun, berhati-hati dinasihatkan, kerana lipatan fungsi berpotensi memecahkan kod yang bergantung pada alamat fungsi yang berbeza.
Atas ialah kandungan terperinci Adakah Fungsi Distinct C Sentiasa Mempunyai Alamat Berbeza?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!