Bagikan melalui


volatil (C++)

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 berlapis struct—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

Lihat juga

Kata kunci
const
const dan Volatile Pointers