Apa yang dimaksud dengan aturan " seolah-olah "?
Aturan " seolah-olah " pada dasarnya menentukan transformasi apa yang diizinkan untuk dilakukan implementasi pada program C ++ legal. Singkatnya, semua transformasi yang tidak mempengaruhi " perilaku yang dapat diamati " program (lihat di bawah untuk definisi yang tepat) diperbolehkan.
Tujuannya adalah memberikan kebebasan implementasi untuk melakukan pengoptimalan selama perilaku program tetap sesuai dengan semantik yang ditentukan oleh C ++ Standard dalam hal mesin abstrak.
Di mana Standar memperkenalkan aturan ini?
Standar C ++ 11 memperkenalkan aturan " seolah-olah " di Paragraf 1.9 / 1:
Deskripsi semantik dalam Standar Internasional ini mendefinisikan mesin abstrak nondeterministik berparameter. Standar Internasional ini tidak mensyaratkan struktur implementasi yang sesuai. Secara khusus, mereka tidak perlu menyalin atau meniru struktur mesin abstrak. Sebaliknya, implementasi yang sesuai diperlukan untuk meniru (hanya) perilaku yang dapat diamati dari mesin abstrak seperti yang dijelaskan di bawah ini.
Juga, catatan kaki penjelasan menambahkan:
Ketentuan ini kadang-kadang disebut aturan “seolah-olah” , karena dalam pelaksanaannya bebas mengabaikan setiap persyaratan Standar Internasional ini sepanjang persyaratan tersebut seolah-olah telah dipatuhi, sejauh dapat ditentukan dari perilaku yang dapat diamati. dari program. Misalnya, implementasi aktual tidak perlu mengevaluasi bagian dari ekspresi jika dapat menyimpulkan bahwa nilainya tidak digunakan dan tidak ada efek samping yang mempengaruhi perilaku program yang dapat diamati yang dihasilkan.
Apa yang diamanatkan oleh aturan itu?
Paragraf 1.9 / 5 lebih lanjut menentukan:
Implementasi yang sesuai dengan menjalankan program yang terbentuk dengan baik akan menghasilkan perilaku yang dapat diamati yang sama sebagai salah satu kemungkinan eksekusi dari instance yang sesuai dari mesin abstrak dengan program yang sama dan input yang sama . Namun, jika eksekusi semacam itu mengandung operasi yang tidak ditentukan, Standar Internasional ini tidak menempatkan persyaratan pada pelaksanaan yang menjalankan program tersebut dengan masukan tersebut (bahkan tidak berkaitan dengan operasi sebelum operasi yang tidak ditentukan pertama).
Perlu ditekankan bahwa batasan ini hanya berlaku ketika "menjalankan program yang dibentuk dengan baik" , dan bahwa kemungkinan hasil dari menjalankan program yang berisi perilaku yang tidak ditentukan tidak dibatasi. Ini dijelaskan dalam Paragraf 1.9 / 4 juga:
Operasi tertentu lainnya dijelaskan dalam Standar Internasional ini sebagai tidak terdefinisi (misalnya, efek dari mencoba memodifikasi objek const). [Catatan: Standar Internasional ini tidak memberlakukan persyaratan pada perilaku program yang mengandung perilaku tidak terdefinisi . —Kirim catatan]
Akhirnya, mengenai definisi " perilaku yang dapat diamati ", Paragraf 1.9 / 8 berbunyi sebagai berikut:
Persyaratan paling sedikit untuk implementasi yang sesuai adalah:
- Akses ke objek volatile dievaluasi secara ketat sesuai dengan aturan mesin abstrak.
- Pada penghentian program, semua data yang ditulis ke dalam file harus identik dengan salah satu kemungkinan hasil yang akan dihasilkan oleh eksekusi program sesuai dengan semantik abstrak.
- Dinamika input dan output dari perangkat interaktif harus berlangsung sedemikian rupa sehingga mendorong output benar-benar dikirimkan sebelum program menunggu input. Apa yang merupakan perangkat interaktif ditentukan oleh implementasi.
Ini secara kolektif disebut sebagai perilaku program yang dapat diamati . [ Catatan : Korespondensi yang lebih ketat antara semantik abstrak dan aktual dapat ditentukan oleh setiap implementasi. - catatan akhir ]
Apakah ada situasi di mana aturan ini tidak berlaku?
Sepengetahuan saya, satu-satunya pengecualian untuk aturan " seolah-olah " adalah menyalin / memindahkan elision, yang diizinkan meskipun salinan konstruktor, pemindah konstruktor, atau penghancur kelas memiliki efek samping. Kondisi yang tepat untuk ini ditentukan dalam Paragraf 12.8 / 31:
Ketika kriteria tertentu terpenuhi, implementasi diperbolehkan untuk menghilangkan salinan / memindahkan konstruksi objek kelas, bahkan jika konstruktor dipilih untuk operasi salin / pemindahan dan / atau destruktor untuk objek memiliki efek samping . [...]