Acabo de darme cuenta de que todos los lenguajes de programación OO modernos con los que estoy al menos algo familiarizado (que es básicamente solo Java, C # y D) permiten matrices covariantes. Es decir, una matriz de cadenas es una matriz de objetos:
Object[] arr = new String[2]; // Java, C# and D allow this
Las matrices de Covariant son un agujero en el sistema de tipo estático. Posibilitan errores de tipo que no pueden detectarse en tiempo de compilación, por lo que cada escritura en una matriz debe verificarse en tiempo de ejecución:
arr[0] = "hello"; // ok
arr[1] = new Object(); // ArrayStoreException
Esto parece un golpe de rendimiento terrible si hago muchas tiendas de arreglos.
C ++ no tiene matrices covariantes, por lo que no hay necesidad de realizar dicha verificación en tiempo de ejecución, lo que significa que no hay una penalización de rendimiento.
¿Se realiza algún análisis para reducir la cantidad de verificaciones de tiempo de ejecución necesarias? Por ejemplo, si digo:
arr[1] = arr[0];
se podría argumentar que la tienda no puede fallar. Estoy seguro de que hay muchas otras optimizaciones posibles que no he pensado.
¿Los compiladores modernos realmente hacen este tipo de optimizaciones, o tengo que vivir con el hecho de que, por ejemplo, un Quicksort siempre hace O (n log n) verificaciones de tiempo de ejecución innecesarias?
¿Pueden los idiomas OO modernos evitar la sobrecarga creada al admitir matrices de co-variante?