Ho appena notato che ogni linguaggio di programmazione OO moderno con cui ho almeno una certa familiarità (che è fondamentalmente solo Java, C # e D) consente matrici covarianti. Cioè, un array di stringhe è un array di oggetti:
Object[] arr = new String[2]; // Java, C# and D allow this
Gli array di covarianti sono un buco nel sistema di tipi statici. 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 runtime:
arr[0] = "hello"; // ok
arr[1] = new Object(); // ArrayStoreException
Questo mi sembra un terribile colpo di prestazioni se faccio un sacco di negozi di array.
C ++ non ha array covarianti, quindi non c'è bisogno di fare un tale controllo di runtime, il che significa che non c'è penalità di prestazioni.
Esiste qualche 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ò fallire. Sono sicuro che ci sono molte altre ottimizzazioni possibili a cui non ho pensato.
I compilatori moderni eseguono effettivamente questi tipi di ottimizzazioni, oppure 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 l'overhead creato supportando gli array in co-variante?