我只是注意到,我至少有点熟悉的每种现代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语言是否可以避免因支持协变量数组而产生的开销?