Acabo de notar que cada lenguaje de programación OO moderno con el que estoy al menos algo familiarizado (que es básicamente Java, C # y D) permite 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 covariantes son un agujero en el sistema de tipo estático. Hacen posibles errores de tipo que no se pueden detectar 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 terrible golpe de rendimiento si hago muchas tiendas de arreglos.
C ++ no tiene matrices covariantes, por lo que no es necesario hacer una verificación de tiempo de ejecución, lo que significa que no hay penalización de rendimiento.
¿Se realiza algún análisis para reducir la cantidad de comprobaciones 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 en las que no he pensado.
¿Realmente los compiladores modernos hacen este tipo de optimizaciones, o tengo que vivir con el hecho de que, por ejemplo, un Quicksort siempre realiza O (n log n) comprobaciones de tiempo de ejecución innecesarias?
¿Pueden los lenguajes OO modernos evitar la sobrecarga creada al admitir matrices covariantes?