Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Dua Pembolehubah pada Alamat Memori Yang Sama Boleh Memegang Nilai Berbeza Disebabkan oleh `const` dan Pengoptimuman Pengkompil?
Dalam coretan kod yang disediakan, dua pembolehubah nampaknya menduduki alamat memori yang sama tetapi tahan nilai yang berbeza. Untuk merungkai paradoks ini, adalah penting untuk memahami semantik const dan pengoptimuman pengkompil berpotensi yang boleh mentakrifkan semula tingkah lakunya.
Kod memulakan pembolehubah const int N dengan nilai 22. Kemudian, ia memperoleh penunjuk pN ke alamat N dengan secara kreatif menghantar penuding kepada const kepada penunjuk kepada bukan const. Selepas itu, nilai yang ditunjukkan oleh pN diubah suai kepada 33, menghasilkan output berikut:
N: 22 Address: 0x22ff74 *pN: 33 Address: 0x22ff74
Nampaknya, kedua-dua N dan *pN mempunyai nilai yang berbeza walaupun merujuk lokasi memori yang sama. Percanggahan yang kelihatan ini berpunca daripada pengoptimuman pengkompil yang mentafsir nilai const sebagai pemalar masa kompilasi.
Dalam senario ini, pengkompil menyedari bahawa nilai N tidak akan berubah. Ia mengoptimumkan kod untuk menggantikan semua rujukan kepada N dengan nilai sebenar, dengan berkesan memintas penetapan const. Pengoptimuman ini pada asasnya menukar:
*pN = 33;
ke dalam:
22 = 33;
Memandangkan tugasan ini jelas tidak sah, pengkompil melaporkan ralat. Walau bagaimanapun, kod yang dipersoalkan memberikan nilai yang diubah suai kepada lokasi yang asalnya ditunjukkan oleh pN. Tingkah laku ini berlaku kerana pengkompil membenarkan anda mengubah suai memori yang ditunjuk oleh penuding const, walaupun alamat yang ditunjuk kepada adalah const.
Oleh itu, manakala N mengekalkan nilai asalnya 22 disebabkan oleh constnya penunjukan, pN menunjuk ke lokasi yang telah diubah suai untuk mengandungi 33. Akhirnya, walaupun menduduki alamat memori yang sama, N dan *pN memegang nilai yang berbeza, menunjukkan peranan kuat pengoptimuman pengkompil dalam membentuk pelaksanaan kod.
Atas ialah kandungan terperinci Bagaimanakah Dua Pembolehubah pada Alamat Memori Yang Sama Boleh Memegang Nilai Berbeza Disebabkan oleh `const` dan Pengoptimuman Pengkompil?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!