C++ yang tidak menentu

C Yang Tidak Menentu

“Pembangun aplikasi ruang pengguna hendaklah sentiasa merujuk manual pengkompil yang berkaitan untuk mengetahui cara kelayakan boleh dikendalikan dalam pelbagai konteks kerana tingkah laku kata kunci yang tidak menentu biasanya dilihat sebagai bergantung kepada perkakasan. Apabila objek ditandakan sebagai tidak menentu, pengkompil sering dimaklumkan bahawa ia tidak boleh dioptimumkan untuk operasi pemuatan dan hendaklah sentiasa diambil daripada memori utama dan bukannya daftar atau cache. Walau bagaimanapun, apabila pengkompil cuba meletakkan lokasi memori ke dalam daftar, ia akan dicache secara automatik walaupun terdapat banyak peringkat cache yang sebahagian besarnya tidak tersedia untuk perisian dan hanya diselenggara dalam perkakasan. Akibatnya, RAM boleh diakses berkali-kali lebih pantas daripada talian cache berhampiran CPU berbanding dari lokasi memori yang sama.

Isu boleh berlaku jika kami tidak menggunakan kelayakan yang tidak menentu yang merangkumi, apabila pengoptimuman didayakan, kod mungkin tidak berfungsi seperti yang diharapkan. Apabila gangguan digunakan dan didayakan, kod tidak boleh berfungsi seperti yang dirancang. Data hanya disimpan dalam storan yang tidak menentu semasa kuasa dihidupkan. Apabila bekalan dialih keluar, kehilangan data berlaku.

Walau bagaimanapun, storan tidak meruap menyimpan data walaupun kuasa padam. Maklumat proses disimpan secara ringkas pada storan yang tidak menentu kerana ia jauh lebih cepat daripada storan yang tidak menentu. Berbanding dengan storan yang tidak menentu, storan yang tidak menentu adalah lebih sesuai untuk melindungi data sensitif. Ini kerana data tidak boleh diakses apabila bekalan kuasa dimatikan. Storan tidak menentu kos yang tinggi kerana sistem komputer hanya boleh memuatkan beberapa MB hingga beberapa GB daripadanya.”



Sifat Volatile Qualifier dalam C++

Cara kelayakan tidak menentu C++ akan ditunjukkan di sini. Apabila kami mengisytiharkan pembolehubah, penentu kelayakan 'tidak menentu' digunakan. Ia berfungsi sebagai peringatan kepada pengkompil bahawa nilai boleh berubah pada bila-bila masa. Yang tidak menentu mempunyai beberapa sifat yang disenaraikan di bawah.



• Tugasan memori tidak boleh ditukar dengan kata kunci yang tidak menentu.



• Pembolehubah daftar tidak boleh dicache.

• Dari segi tugasan, nilai tidak boleh diubah.

Penggunaan Volatile Qualifier dalam C++

1. Walaupun kod anda tidak mengubah suai nilai pembolehubah, ia mungkin berbuat demikian. Akibatnya, setiap kali pengkompil menyemak keadaan pembolehubah, ia tidak boleh menganggap bahawa ia adalah sama dengan nilai terbaharu yang dibaca daripadanya atau nilai terbaharu yang disimpan; sebaliknya, ia mesti memperoleh nilai pembolehubah sekali lagi.



2. Pengkompil tidak diperlukan untuk menghapuskan tindakan menyimpan nilai kerana ia adalah 'kesan sampingan' yang boleh dilihat dari luar dan berlaku apabila nilai disimpan dalam pembolehubah yang tidak menentu. Sebagai contoh, jika dua nilai diletakkan dalam satu baris, pengkompil mesti meletakkan nilai dua kali.

Sintaks Volatile Qualifier dalam C++

# Nama_pembolehubah jenis data tidak menentu

Kata kunci yang tidak menentu mesti digunakan dalam pengisytiharan dan jenis data merujuk kepada sebarang jenis data, termasuk dua kali ganda, apungan atau integer. Akhir sekali, kami memilih nama untuk pembolehubah. Kita boleh menentukan pembolehubah yang tidak menentu menggunakan salah satu kaedah kerana kedua-dua pengisytiharan adalah sah.

Contoh: Kelayakan Meruap Digunakan untuk Mengenalpasti Objek Yang Boleh Diubah Suai oleh Benang Lain atau Tindakan Luar dalam C++

Jika objek ditukar oleh isyarat luar atau prosedur yang bertindak sebagai gangguan, nilai yang diubah perlu diambil daripada RAM kerana keadaan cache tidak lagi sesuai untuk sementara waktu. Akibatnya, pengkompil mengendalikan akses kepada objek yang tidak menentu dengan sewajarnya.

#include
#include
#include

menggunakan std :: cout ;
menggunakan std :: endl ;
menggunakan std :: cerr ;
menggunakan std :: makan ;

tidak menentu int detik = 0 ;

batal DelayFiveSeconds ( ) {
sementara ( detik < 3 ) {
tidur ( 200000 ) ;
        cerr << 'menunggu...' << endl ;
}
}

batal IncrementSeconds ( ) {
untuk ( int i = 0 ; i < 5 ; ++ i ) {
tidur ( 1 ) ;
        cerr << 'bertambah' << endl ;
detik = detik + 1 ;
}
}

int utama ( ) {
struct permulaan masa { } ;
struct akhir zaman { } ;
std :: benang benang1 ;

benang1 = std :: benang ( IncrementSeconds ) ;

DelayFiveSeconds ( ) ;

benang1. sertai ( ) ;
kembali EXIT_SUCCESS ;
}


Untuk menggambarkan senario yang berpotensi, kami telah menggunakan kata kunci yang tidak menentu yang mempunyai pembolehubah diisytiharkan sebagai Saat jenis data 'int' dan memberikan nilai 0 kepadanya. Kemudian, kami membina dua fungsi: satu sebagai 'DelayFiveSeconds' yang mengubah pembolehubah integer tidak menentu global, dan satu lagi sebagai 'IncrementSeconds' yang melakukan penilaian yang sama dalam gelung while. Perlu diingatkan bahawa contoh ini membenarkan gelung while digelung selama beberapa saat apabila detik sepatutnya kurang daripada 3.

Apabila syarat memenuhi, maka blok while akan dilaksanakan. Di dalam blok sementara, kami telah menggunakan kaedah unsleep yang mencetak pernyataan 'menunggu'. Fungsi 'IncrementSceonds' mempunyai gelung untuk. Selepas lelaran, kaedah tidur digunakan, yang mencetak pernyataan 'kenaikan' dan menambah pembolehubah 'saat'. Pelaksanaan awal fungsi 'IncrementSeconds' dilakukan oleh benang berasingan yang dicipta oleh fungsi utama. Kaedah 'DelayFiveSeconds' kemudiannya dipanggil oleh utas utama, memasukkan gelung yang tidak akan berakhir jika pembolehubah saat tidak bergerak melebihi nilai 5.

Sebaik sahaja urutan utama menyedari nilai pembolehubah saat telah berubah, ia akan kembali daripada kaedah kerana utas lain telah mula meningkatkannya secara serentak.

Untuk menjalankan kod benang dalam C++, kita harus menggunakan arahan 'g++ -pthread –o filename filename.cc'. Jika anda tidak menggunakan '-pthread' dalam arahan, maka terdapat kemungkinan pengecualian dilemparkan oleh pengkompil. Akibatnya, kami membuat fungsi tunggu bersyarat dengan berkesan yang menunggu sehingga objek meruap diubah oleh daya luar. Adalah penting untuk diingat bahawa blok kod kemas kini boleh datang daripada bahagian terjemahan yang berbeza atau tindakan isyarat luaran, walaupun kod ini masih akan berfungsi sama jika kelayakan yang tidak menentu dialih keluar dan pembolehubah global konvensional digunakan.

Kesimpulan

Di sini, kami menyemak ikhtisar Volatile dalam C++ bersama-sama dengan sintaks, penggunaan dan contoh yang sesuai untuk pemahaman yang lebih baik. Memandangkan pengkompil tidak dapat meramalkan nilai, tidak menentu adalah penting dalam pengaturcaraan C. Faedah utama menggunakan tidak menentu ialah nilainya mungkin berbeza-beza apabila pengguna memintanya untuk diubah suai atau apabila beberapa urutan lain yang menggunakan pembolehubah yang sama aktif.