Tôi chỉ nhận thấy rằng mọi ngôn ngữ lập trình OO hiện đại mà tôi ít nhất là quen thuộc (về cơ bản chỉ là Java, C # và D) cho phép các mảng covariant. Đó là, một mảng chuỗi là một mảng đối tượng:
Object[] arr = new String[2]; // Java, C# and D allow this
Mảng covariant là một lỗ hổng trong hệ thống kiểu tĩnh. Chúng tạo ra các lỗi loại có thể không thể được phát hiện tại thời gian biên dịch, do đó, mỗi lần ghi vào một mảng phải được kiểm tra trong thời gian chạy:
arr[0] = "hello"; // ok
arr[1] = new Object(); // ArrayStoreException
Đây có vẻ là một hiệu suất khủng khiếp nếu tôi làm nhiều cửa hàng mảng.
C ++ không có mảng covariant, do đó không cần phải thực hiện kiểm tra thời gian chạy như vậy, điều đó có nghĩa là không có hình phạt hiệu năng.
Có bất kỳ phân tích được thực hiện để giảm số lượng kiểm tra thời gian chạy cần thiết? Ví dụ: nếu tôi nói:
arr[1] = arr[0];
người ta có thể lập luận rằng các cửa hàng có thể không thể thất bại. Tôi chắc chắn có rất nhiều tối ưu hóa có thể khác mà tôi chưa từng nghĩ đến.
Các trình biên dịch hiện đại có thực sự thực hiện các loại tối ưu hóa này không, hay tôi phải sống với thực tế là, ví dụ, Quicksort luôn kiểm tra thời gian chạy không cần thiết O (n log n)?
Các ngôn ngữ OO hiện đại có thể tránh được chi phí được tạo ra bằng cách hỗ trợ các mảng đồng biến thể không?