Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Kualifikasi jenis yang dapat Anda gunakan untuk menyatakan bahwa objek dapat dimodifikasi dalam program oleh perangkat keras.
Sintaks
volatile declarator ;
Keterangan
Anda dapat menggunakan sakelar pengkompilasi /volatil untuk memodifikasi bagaimana pengkompilasi menginterpretasikan kata kunci ini.
Visual Studio menginterpretasikan volatile
kata kunci secara berbeda tergantung pada arsitektur target. Untuk ARM, jika tidak ada opsi kompilator /volatile yang ditentukan, pengkompilasi melakukan seolah-olah /volatile:iso ditentukan. Untuk arsitektur selain ARM, jika tidak ada opsi kompilator /volatile yang ditentukan, pengompilasi melakukan seolah-olah /volatile:ms ditentukan; oleh karena itu, untuk arsitektur selain ARM kami sangat menyarankan agar Anda menentukan /volatile:iso, dan menggunakan primitif sinkronisasi eksplisit dan intrinsik kompilator ketika Anda berhadapan dengan memori yang dibagikan di seluruh utas.
Anda dapat menggunakan volatile
kualifikasi untuk menyediakan akses ke lokasi memori yang digunakan oleh proses asinkron seperti penghandel gangguan.
Ketika volatile
digunakan pada variabel yang juga memiliki kata kunci __restrict , volatile
lebih diutamakan.
struct
Jika anggota ditandai sebagai volatile
, maka volatile
disebarluaskan ke seluruh struktur. Jika struktur tidak memiliki panjang yang dapat disalin pada arsitektur saat ini dengan menggunakan satu instruksi, volatile
mungkin benar-benar hilang pada struktur tersebut.
Kata volatile
kunci mungkin tidak berpengaruh pada bidang jika salah satu kondisi berikut ini benar:
Panjang bidang volatil melebihi ukuran maksimum yang dapat disalin pada arsitektur saat ini dengan menggunakan satu instruksi.
Panjang terluar yang berisi
struct
—atau jika itu adalah anggota dari kemungkinan berlapisstruct
—melebihi ukuran maksimum yang dapat disalin pada arsitektur saat ini dengan menggunakan satu instruksi.
Meskipun prosesor tidak menyusun ulang akses memori yang tidak dapat di-cache, variabel yang tidak dapat di-cache harus ditandai untuk volatile
menjamin bahwa kompilator tidak menyusun ulang akses memori.
Objek yang dinyatakan sebagai volatile
tidak digunakan dalam pengoptimalan tertentu karena nilainya dapat berubah kapan saja. Sistem selalu membaca nilai objek volatil saat ini ketika diminta, bahkan jika instruksi sebelumnya meminta nilai dari objek yang sama. Selain itu, nilai objek ditulis segera pada penugasan.
Iso sesuai
Jika Anda terbiasa dengan kata kunci volatil C#, atau terbiasa dengan perilaku volatile
dalam versi kompilator Microsoft C++ (MSVC) sebelumnya, ketahuilah bahwa kata kunci Standar ISO volatile
C++11 berbeda dan didukung di MSVC ketika opsi pengkompilasi /volatile:iso ditentukan. (Untuk ARM, itu ditentukan secara default). Kata volatile
kunci dalam kode STANDAR ISO C++11 hanya akan digunakan untuk akses perangkat keras; jangan gunakan untuk komunikasi antar alur. Untuk komunikasi antar alur, gunakan mekanisme seperti std::atomic<T> dari Pustaka Standar C++.
Akhir iso sesuai
Khusus Microsoft
Ketika opsi kompilator /volatile:ms digunakan—secara default ketika arsitektur selain ARM ditargetkan—pengkompilasi menghasilkan kode tambahan untuk mempertahankan pemesanan di antara referensi ke objek volatil selain mempertahankan pemesanan ke referensi ke objek global lainnya. Secara khusus:
Penulisan ke objek volatil (juga dikenal sebagai penulisan volatil) memiliki semantik Rilis; yaitu, referensi ke objek global atau statis yang terjadi sebelum penulisan ke objek volatil dalam urutan instruksi akan terjadi sebelum penulisan volatil tersebut dalam biner yang dikompilasi.
Baca objek volatil (juga dikenal sebagai bacaan volatil) memiliki Memperoleh semantik; yaitu, referensi ke objek global atau statis yang terjadi setelah pembacaan memori volatil dalam urutan instruksi akan terjadi setelah pembacaan volatil tersebut dalam biner yang dikompilasi.
Ini memungkinkan objek volatil digunakan untuk kunci memori dan rilis dalam aplikasi multithread.
Catatan
Ketika mengandalkan jaminan yang ditingkatkan yang disediakan ketika opsi pengkompilasi /volatile:ms digunakan, kode tidak portabel.
END Khusus Microsoft