При проектуванні і implenting об'єктно-орієнтована мова програмування, в якій - то момент один повинен зробити вибір про реалізацію основних типів (як int
, float
, double
або їх еквіваленти) , як класи або що - то інше. Зрозуміло, що мови в сім'ї С мають тенденцію не визначати їх як класи (Java має спеціальні примітивні типи, C # реалізує їх як незмінні структури тощо).
Я можу подумати про дуже важливу перевагу, коли основні типи реалізуються як класи (у типовій системі з єдиною ієрархією): ці типи можуть бути належними підтипами Лискова кореневого типу. Таким чином, ми уникаємо ускладнення мови бокс / розблокування (явне або неявне), типи обгортки, спеціальні правила дисперсії, особлива поведінка тощо.
Звичайно, я частково можу зрозуміти, чому мовні дизайнери вирішують, як вони роблять: екземпляри класів, як правило, мають певні просторові накладні витрати (оскільки екземпляри можуть містити vtable або інші метадані в їх макеті пам'яті), що примітивам / структурам не потрібно є (якщо мова не дозволяє успадкувати їх).
Чи просторова ефективність (і поліпшена просторова локальність, особливо у великих масивах) є єдиною причиною, чому фундаментальні типи часто не є класами?
Я, як правило, вважав, що відповідь "так", але компілятори мають алгоритми аналізу втечі, і, таким чином, вони можуть визначити, чи можуть (вибірково) опускати просторові накладні витрати, коли екземпляр (будь-який екземпляр, а не лише фундаментальний тип) виявляється строго. місцеві.
Чи є вищезгадане неправильним, чи щось мені не вистачає?