Penjelasan abstrak
Baik C dan C ++ memiliki konsep mesin abstrak . Ketika kode menggunakan nilai beberapa variabel, mesin abstrak mengatakan implementasinya harus mengakses nilai variabel itu. Kode formulir statement_A; statement_B; statement_C;
harus dieksekusi persis dengan urutan yang ditentukan. Ekspresi yang umum untuk ketiga pernyataan tersebut harus dihitung ulang setiap kali terjadi.
Per mesin abstrak, diberi urutan pernyataan statement_A; statement_B; statement_C;
, implementasi harus terlebih dahulu berkinerja statement_A
secara keseluruhan, lalu statement_B
, dan akhirnya statement_C
. Implementasinya tidak dapat mengingat bahwa Anda menetapkan age
nilai 5. Setiap pernyataan yang referensi age
harus mengakses nilai variabel itu.
Tidak perlu volatile
kata kunci jika implementasi C atau C ++ kode dieksekusi ketat sesuai spesifikasi mesin abstrak. Mesin abstrak C dan C ++ tidak memiliki konsep register, tidak ada konsep subekspresi umum, dan urutan eksekusi ketat.
Kedua bahasa juga memiliki aturan seolah-olah . Implementasi sesuai dengan standar asalkan implementasi berperilaku seolah-olah telah melakukan hal-hal sesuai spesifikasi mesin abstrak. Kompilator dapat mengasumsikan variabel non-volatil tidak mengubah nilai di antara tugas. Selama itu tidak melanggar as-if
aturan, urutan statement_A; statement_B; statement_C;
mungkin dilaksanakan dengan mengeksekusi bagian statement_C
, lalu bagian statement_A
, lalu semua statement_B
, lalu sisanya statement_A
, dan akhirnya sisanya statement_C
.
Mereka as-olah aturan tidak berlaku untuk volatile
variabel. Berkenaan dengan volatile
variabel dan fungsi, suatu implementasi harus melakukan persis apa yang Anda perintahkan, dan sesuai dengan urutan Anda menyuruhnya melakukan sesuatu.
Ada kerugian untuk spesifikasi mesin abstrak: Ini lambat. Salah satu aspek positif dari C dan C ++ dibandingkan dengan bahasa lain adalah mereka cukup cepat. Ini tidak akan menjadi kasus jika kode dieksekusi per mesin abstrak ini. Aturan as-if yang memungkinkan C dan C ++ menjadi sangat cepat.
ELI5 menjawab
apa artinya ketika kompiler tidak "mengoptimalkan" alamat memori?
"Mengoptimalkan pergi" alamat memori adalah konsep canggih, sesuatu yang tidak berada dalam ranah kemampuan anak berusia lima tahun. Anak lima tahun yang patuh akan melakukan persis apa yang Anda perintahkan, tidak lebih, tidak kurang. Dengan volatile
, Anda memberi tahu implementasi untuk bertindak seperti lima: Tidak berpikir, tidak ada optimisasi mewah. Sebaliknya, implementasi harus melakukan persis apa yang diperintahkan oleh kode.
volatile
variabel dan dikatakan 5, dan Anda membacanya lagi tahun depan, Anda dijamin akan mendapatkan 6.