Saya hanya memperhatikan bahwa setiap bahasa pemrograman OO modern yang paling tidak saya kenal (yang pada dasarnya hanya Java, C # dan D) memungkinkan array kovarian. Artinya, array string adalah array objek:
Object[] arr = new String[2]; // Java, C# and D allow this
Array kovarian adalah lubang pada sistem tipe statis. Mereka membuat kesalahan tipe mungkin yang tidak dapat dideteksi pada waktu kompilasi, jadi setiap penulisan ke array harus diperiksa saat runtime:
arr[0] = "hello"; // ok
arr[1] = new Object(); // ArrayStoreException
Sepertinya ini adalah kinerja yang buruk jika saya melakukan banyak toko array.
C ++ tidak memiliki array kovarian, jadi tidak perlu melakukan pemeriksaan runtime, yang berarti tidak ada penalti kinerja.
Apakah ada analisis yang dilakukan untuk mengurangi jumlah pemeriksaan runtime yang diperlukan? Misalnya, jika saya katakan:
arr[1] = arr[0];
orang bisa berpendapat bahwa toko itu tidak mungkin gagal. Saya yakin ada banyak kemungkinan optimasi lain yang belum saya pikirkan.
Apakah kompiler modern benar-benar melakukan optimasi semacam ini, atau apakah saya harus hidup dengan kenyataan bahwa, misalnya, Quicksort selalu melakukan O (n log n) pemeriksaan runtime yang tidak perlu?
Bisakah bahasa OO modern menghindari overhead yang dibuat dengan mendukung array co-varian?