Я щойно помітив, що кожна сучасна мова програмування OO, якою я, принаймні, дещо знайома (що в основному є лише Java, C # і D), дозволяє коваріантні масиви. Тобто рядковий масив - це об'єктний масив:
Object[] arr = new String[2]; // Java, C# and D allow this
Коваріантні масиви - це дірка в системі статичного типу. Вони роблять можливими помилки типу, які неможливо виявити під час компіляції, тому кожне записування до масиву повинно перевірятися під час виконання:
arr[0] = "hello"; // ok
arr[1] = new Object(); // ArrayStoreException
Це здається страшним ударом, якщо я маю багато магазинів.
У C ++ немає коваріантних масивів, тому не потрібно проводити таку перевірку виконання, що означає, що не існує штрафу за продуктивність.
Чи робиться якийсь аналіз, щоб зменшити кількість перевірок виконання? Наприклад, якщо я скажу:
arr[1] = arr[0];
можна стверджувати, що магазин не може вийти з ладу. Я впевнений, що існує багато інших можливих оптимізацій, про які я не думав.
Чи справді сучасні компілятори роблять такі оптимізації, чи мені доводиться жити з тим фактом, що, наприклад, Quicksort завжди робить непотрібні перевірки часу O (n log n)?
Чи можуть сучасні мови OO уникати накладних витрат, створених підтримкою ко-варіантних масивів?