少なくともある程度慣れ親しんでいる最新のオブジェクト指向プログラミング言語(基本的には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];
ストアが失敗することはないと主張することができます。私が考えていない他の多くの可能な最適化があると確信しています。
最新のコンパイラーは実際にこの種の最適化を行いますか、または、例えばクイックソートが常にO(n log n)の不要なランタイムチェックを行うという事実に耐えなければなりませんか?
現代のオブジェクト指向言語は、共変配列をサポートすることによって生じるオーバーヘッドを回避できますか?