Właśnie zauważyłem, że każdy współczesny język programowania OO, który jestem przynajmniej w pewnym stopniu zaznajomiony (który jest w zasadzie tylko Javą, C # i D) pozwala na tablice kowariantne. Oznacza to, że tablica łańcuchowa jest tablicą obiektową:
Object[] arr = new String[2]; // Java, C# and D allow this
Macierze kowariantne są dziurą w systemie typu statycznego. Umożliwiają błędy typu, których nie można wykryć podczas kompilacji, dlatego każdy zapis do tablicy musi być sprawdzany w czasie wykonywania:
arr[0] = "hello"; // ok
arr[1] = new Object(); // ArrayStoreException
To wydaje się być strasznym spadkiem wydajności, jeśli robię wiele sklepów z tablicami.
C ++ nie ma tablic kowariantnych, więc nie ma potrzeby przeprowadzania takiej kontroli środowiska uruchomieniowego, co oznacza, że nie ma ograniczenia wydajności.
Czy przeprowadzono analizę w celu zmniejszenia liczby koniecznych kontroli środowiska wykonawczego? Na przykład, jeśli powiem:
arr[1] = arr[0];
można argumentować, że sklep nie może zawieść. Jestem pewien, że istnieje wiele innych możliwych optymalizacji, o których nawet nie myślałem.
Czy współczesne kompilatory faktycznie wykonują tego rodzaju optymalizacje, czy też muszę żyć z faktem, że na przykład Quicksort zawsze wykonuje O (n log n) niepotrzebne kontrole środowiska wykonawczego?
Czy współczesne języki OO mogą uniknąć narzutów generowanych przez obsługę macierzy alternatywnych?