Acabei de notar que toda linguagem de programação OO moderna com a qual estou familiarizado (que é basicamente apenas Java, C # e D) permite matrizes covariantes. Ou seja, uma matriz de cadeias de caracteres é uma matriz de objetos:
Object[] arr = new String[2]; // Java, C# and D allow this
Matrizes covariantes são um orifício no sistema de tipo estático. Eles possibilitam erros de tipo que não podem ser detectados em tempo de compilação, portanto, toda gravação em uma matriz deve ser verificada em tempo de execução:
arr[0] = "hello"; // ok
arr[1] = new Object(); // ArrayStoreException
Parece um desempenho terrível se eu fizer muitas lojas de matriz.
O C ++ não possui matrizes covariantes, portanto, não há necessidade de fazer essa verificação de tempo de execução, o que significa que não há penalidade de desempenho.
Existe alguma análise feita para reduzir o número de verificações de tempo de execução necessárias? Por exemplo, se eu disser:
arr[1] = arr[0];
alguém poderia argumentar que a loja não pode falhar. Tenho certeza de que existem muitas outras otimizações possíveis em que não pensei.
Os compiladores modernos realmente fazem esse tipo de otimização ou eu tenho que conviver com o fato de que, por exemplo, um Quicksort sempre verifica O (n log n) verificações de tempo de execução desnecessárias?
Os idiomas OO modernos podem evitar a sobrecarga criada pelo suporte a matrizes de co-variantes?