Ketika merancang dan implenting bahasa pemrograman berorientasi objek, di beberapa titik kita harus membuat pilihan tentang pelaksanaan jenis dasar (seperti int
, float
, double
atau setara) sebagai kelas atau sesuatu yang lain. Jelas, bahasa dalam keluarga C memiliki kecenderungan untuk tidak mendefinisikan mereka sebagai kelas (Java memiliki tipe primitif khusus, C # mengimplementasikannya sebagai struct yang tidak dapat diubah, dll).
Saya dapat memikirkan keuntungan yang sangat penting ketika tipe fundamental diimplementasikan sebagai kelas (dalam sistem tipe dengan hierarki yang disatukan): tipe ini dapat menjadi subtipe Liskov yang tepat dari tipe root. Dengan demikian, kami menghindari mempersulit bahasa dengan tinju / unboxing (baik eksplisit atau implisit), tipe wrapper, aturan varians khusus, perilaku khusus, dll.
Tentu saja, saya sebagian dapat memahami mengapa perancang bahasa memutuskan cara mereka melakukannya: instance kelas cenderung memiliki beberapa overhead spasial (karena instance dapat berisi vtable atau metadata lain dalam tata letak memori mereka), bahwa primitif / struct tidak perlu miliki (jika bahasa tidak mengizinkan pewarisan itu).
Apakah efisiensi spasial (dan peningkatan lokalitas spasial, terutama dalam array besar) satu-satunya alasan mengapa tipe fundamental sering bukan kelas?
Saya biasanya menganggap jawabannya adalah ya, tetapi kompiler memiliki algoritma analisis pelarian dan karenanya mereka dapat menyimpulkan apakah mereka dapat (secara selektif) menghilangkan overhead spasial ketika sebuah instance (contoh apa pun, bukan hanya tipe fundamental) terbukti benar-benar ketat. lokal.
Apakah hal di atas salah, atau ada hal lain yang saya lewatkan?