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

Adakah Fungsi Distinct C Sentiasa Mempunyai Alamat Berbeza?

Susan Sarandon
Susan Sarandonasal
2024-12-02 05:41:10382semak imbas

Do Distinct C   Functions Always Have Distinct Addresses?

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!

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