Я только что заметил, что каждый современный язык программирования ОО, с которым я, по крайней мере, немного знаком (в основном это просто 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) ненужные проверки во время выполнения?
Могут ли современные ОО-языки избежать накладных расходов, создаваемых за счет поддержки ко-вариантных массивов?