Dalam beberapa kasus, seperti yang dijelaskan, Standar C ++ memungkinkan kompiler untuk memproses konstruksi dengan cara apa pun yang menurut pelanggan mereka paling berguna, tanpa mengharuskan perilaku dapat diprediksi. Dengan kata lain, konstruksi semacam itu memanggil "Perilaku Tidak Terdefinisi". Itu tidak berarti, bagaimanapun, bahwa konstruksi seperti itu dimaksudkan untuk "dilarang" karena Standar C ++ secara eksplisit mengesampingkan yurisdiksi atas apa yang "boleh" dilakukan oleh program yang dibentuk dengan baik. Sementara saya tidak mengetahui adanya dokumen Rationale yang diterbitkan untuk Standar C ++, fakta bahwa itu menggambarkan Perilaku Tidak Terdefinisi seperti halnya C89 akan menyarankan makna yang dimaksudkan adalah serupa: "Perilaku tidak terdefinisi memberikan lisensi implementor untuk tidak menangkap kesalahan program tertentu yang sulit. untuk mendiagnosis.
Ada banyak situasi di mana cara paling efisien untuk memproses sesuatu akan melibatkan penulisan bagian-bagian dari struktur yang akan dipedulikan kode hilir, sementara mengabaikan yang tidak dipedulikan kode hilir. Mengharuskan program menginisialisasi semua anggota struktur, termasuk yang tidak ada yang peduli, akan menghambat efisiensi.
Lebih lanjut, ada beberapa situasi di mana mungkin paling efisien untuk memiliki data yang tidak diinisialisasi berperilaku dengan cara non-deterministik. Misalnya, diberikan:
struct q { unsigned char dat[256]; } x,y;
void test(unsigned char *arr, int n)
{
q temp;
for (int i=0; i<n; i++)
temp.dat[arr[i]] = i;
x=temp;
y=temp;
}
jika kode hilir tidak akan peduli dengan nilai-nilai elemen apa pun x.dat
atau y.dat
yang indeksnya tidak tercantum arr
, kode tersebut mungkin dioptimalkan untuk:
void test(unsigned char *arr, int n)
{
q temp;
for (int i=0; i<n; i++)
{
int it = arr[i];
x.dat[index] = i;
y.dat[index] = i;
}
}
Peningkatan dalam efisiensi ini tidak akan mungkin jika programmer diminta untuk secara eksplisit menulis setiap elemen temp.dat
, termasuk yang hilir tidak akan peduli, sebelum menyalinnya.
Di sisi lain, ada beberapa aplikasi yang penting untuk menghindari kemungkinan kebocoran data. Dalam aplikasi seperti itu, mungkin berguna untuk memiliki versi kode yang diinstruksikan untuk menjebak setiap upaya untuk menyalin penyimpanan yang tidak diinisialisasi tanpa memperhatikan apakah kode hilir akan melihatnya, atau mungkin berguna untuk memiliki jaminan implementasi bahwa penyimpanan apa pun yang isinya dapat dibocorkan akan menjadi nol atau ditimpa dengan data yang tidak rahasia.
Dari apa yang dapat saya katakan, Standar C ++ tidak berusaha untuk mengatakan bahwa salah satu dari perilaku ini cukup berguna daripada yang lain untuk membenarkan mandatnya. Ironisnya, kurangnya spesifikasi ini dapat dimaksudkan untuk memfasilitasi optimasi, tetapi jika programmer tidak dapat mengeksploitasi segala jenis jaminan perilaku yang lemah, setiap optimasi akan dinegasikan.