Mir ist gerade aufgefallen, dass jede moderne OO-Programmiersprache, mit der ich zumindest ein wenig vertraut bin (die im Grunde nur Java, C # und D ist), kovariante Arrays zulässt. Das heißt, ein String-Array ist ein Objekt-Array:
Object[] arr = new String[2]; // Java, C# and D allow this
Covariante Arrays sind ein Loch im statischen Typsystem. Sie ermöglichen Typfehler, die zur Kompilierungszeit nicht erkannt werden können. Daher muss jedes Schreiben in ein Array zur Laufzeit überprüft werden:
arr[0] = "hello"; // ok
arr[1] = new Object(); // ArrayStoreException
Dies scheint ein schrecklicher Leistungseinbruch zu sein, wenn ich viele Array-Stores betreibe.
C ++ hat keine kovarianten Arrays, daher ist eine solche Laufzeitprüfung nicht erforderlich, was bedeutet, dass es keine Leistungseinbußen gibt.
Wird eine Analyse durchgeführt, um die Anzahl der erforderlichen Laufzeitprüfungen zu verringern? Zum Beispiel, wenn ich sage:
arr[1] = arr[0];
man könnte argumentieren, dass der Laden unmöglich scheitern kann. Ich bin mir sicher, dass es noch viele andere Optimierungsmöglichkeiten gibt, an die ich nicht gedacht habe.
Führen moderne Compiler solche Optimierungen tatsächlich durch, oder muss ich damit leben, dass beispielsweise ein Quicksort immer unnötige Laufzeitprüfungen durchführt?
Können moderne OO-Sprachen den durch die Unterstützung von Co-Varianten-Arrays verursachten Overhead vermeiden?