Ho appena notato che ogni moderno linguaggio di programmazione OO con cui ho almeno una certa familiarità (che è fondamentalmente solo Java, C # e D) consente array covarianti. Cioè, una matrice di stringhe è una matrice di oggetti:
Object[] arr = new String[2]; // Java, C# and D allow this
Le matrici covariant sono un buco nel sistema di tipo statico. Rendono possibili errori di tipo che non possono essere rilevati in fase di compilazione, quindi ogni scrittura su un array deve essere verificata in fase di esecuzione:
arr[0] = "hello"; // ok
arr[1] = new Object(); // ArrayStoreException
Sembra un terribile successo se faccio molti negozi di array.
Il C ++ non ha array covarianti, quindi non è necessario effettuare un controllo di runtime, il che significa che non vi è alcuna penalità di prestazione.
Esistono analisi per ridurre il numero di controlli di runtime necessari? Ad esempio, se dico:
arr[1] = arr[0];
si potrebbe sostenere che il negozio non può assolutamente fallire. Sono sicuro che ci sono molte altre possibili ottimizzazioni a cui non ho pensato.
I compilatori moderni eseguono effettivamente questo tipo di ottimizzazioni o devo convivere con il fatto che, ad esempio, un Quicksort esegue sempre O (n log n) controlli di runtime non necessari?
I moderni linguaggi OO possono evitare il sovraccarico creato supportando gli array di co-variante?