Perilaku yang ditentukan implementasi dan perilaku yang tidak ditentukan
Standar C ++ sangat spesifik tentang efek berbagai konstruksi, dan khususnya Anda harus selalu waspada terhadap kategori masalah berikut :
Perilaku tidak terdefinisi berarti sama sekali tidak ada jaminan yang diberikan. Kode bisa bekerja, atau bisa juga membakar hard drive Anda atau membuat setan terbang keluar hidung Anda . Sejauh menyangkut bahasa C ++, apa pun mungkin terjadi. Secara praktis, ini berarti Anda memiliki bug yang tidak dapat diperbaiki. Jika ini terjadi, Anda tidak dapat mempercayai apa pun tentang aplikasi Anda (karena salah satu efek dari perilaku tidak terdefinisi ini mungkin saja mengacaukan memori yang digunakan oleh aplikasi Anda lainnya). Tidak perlu konsisten, jadi menjalankan program dua kali mungkin memberikan hasil yang berbeda. Ini mungkin tergantung pada fase bulan, warna kemeja yang Anda kenakan, atau hal lainnya.
Perilaku tidak ditentukan berarti bahwa program harus melakukan sesuatu yang waras dan konsisten, tetapi tidak diwajibkan untuk mendokumentasikannya .
Perilaku yang ditentukan implementasi mirip dengan yang tidak ditentukan, tetapi juga harus didokumentasikan oleh penulis kompilator. Contoh dari ini adalah hasil dari a reinterpret_cast
. biasanya , ini hanya mengubah jenis penunjuk, tanpa mengubah alamat, tetapi pemetaan sebenarnya ditentukan oleh implementasi, sehingga kompiler dapat memetakan ke alamat yang sama sekali berbeda, selama ia mendokumentasikan pilihan ini. Contoh lainnya adalah ukuran sebuah int. Standar C ++ tidak peduli apakah itu 2, 4 atau 8 byte, tetapi harus didokumentasikan oleh kompilator
Tetapi yang umum untuk semua ini adalah mereka sebaiknya dihindari. Jika memungkinkan, pertahankan perilaku yang 100% ditentukan oleh standar C ++ itu sendiri. Dengan begitu, Anda dijamin mudah dibawa.
Anda juga sering harus mengandalkan beberapa perilaku yang ditentukan implementasi. Ini mungkin tidak dapat dihindari, tetapi Anda harus tetap memperhatikannya, dan berhati-hatilah karena Anda mengandalkan sesuatu yang dapat berubah di antara kompiler yang berbeda.
Sebaliknya, perilaku tidak terdefinisi harus selalu dihindari. Secara umum, Anda harus berasumsi bahwa itu membuat program Anda meledak dengan satu atau lain cara.