방금 내가 친숙한 모든 현대 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 언어는 공 변형 배열을 지원하여 생성되는 오버 헤드를 피할 수 있습니까?