На абстрактному рівні ви можете включити все, що завгодно, мовою, яку ви розробляєте.
На рівні впровадження неминуче, що деякі з цих речей будуть простішими у виконанні, деякі складнішими, деякі можуть бути зроблені швидко, деякі можуть бути повільнішими тощо. Для цього, дизайнерам часто доводиться приймати важкі рішення та компроміси.
На рівні реалізації одним із найшвидших способів доступу до змінної є пошук її адреси та завантаження вмісту цієї адреси. У більшості процесорів є конкретні інструкції щодо завантаження даних з адрес, і ці інструкції, як правило, повинні знати, скільки байтів потрібно завантажити (один, два, чотири, вісім тощо) і куди потрібно розміщувати дані, які вони завантажують (єдиний реєстр, реєстрація пара, розширений регістр, інша пам'ять тощо). Знаючи розмір змінної, компілятор може точно знати, яку інструкцію випромінювати для використання цієї змінної. Не знаючи розміру змінної, компілятору потрібно було б вдатися до чогось складнішого і, мабуть, повільніше.
На абстрактному рівні точкою підтипу є можливість використовувати екземпляри одного типу, де очікується рівний або більш загальний тип. Іншими словами, може бути записаний код, який очікує об'єкт певного типу або щось більш похідне, не знаючи заздалегідь, що саме це буде. І зрозуміло, оскільки більш похідні типи можуть додавати більше членів даних, похідний тип не обов'язково має такі самі вимоги до пам'яті, як і його базові типи.
На рівні реалізації не існує простого способу для змінної заздалегідь визначеного розміру вмістити примірник невідомого розміру та отримати доступ до нього так, як зазвичай ви називаєте його ефективним. Але є спосіб трохи перемістити речі і використовувати змінну не для зберігання об'єкта, а для ідентифікації об'єкта та дозволення його зберігати десь в іншому місці. Таким чином є посилання (наприклад, адреса пам'яті) - додатковий рівень непрямості, який забезпечує зміну лише для того, щоб містити якусь інформацію фіксованого розміру, доки ми можемо знайти об'єкт за допомогою цієї інформації. Для цього нам просто потрібно завантажити адресу (фіксованого розміру), і тоді ми можемо працювати як завжди, використовуючи ті зсуви об'єкта, які ми знаємо, що є дійсними, навіть якщо цей об’єкт має більше даних при компенсаціях, які ми не знаємо. Ми можемо це зробити, тому що ми не '
На абстрактному рівні цей метод дозволяє зберігати (посилання на a) string
у object
змінну, не втрачаючи інформацію, яка робить її a string
. Це добре, щоб усі типи працювали так, і ви можете також сказати, що це багато в чому елегантно.
Однак на рівні впровадження додатковий рівень опосередкованості передбачає більше інструкцій, і для більшості архітектур це робить кожен доступ до об'єкта дещо повільнішим. Ви можете дозволити компілятору вичавити з програми більше продуктивності, якщо ви включите до своєї мови деякі типи, що часто використовуються, що не мають такого додаткового рівня непрямості (посилання). Але видаляючи цей рівень непрямості, компілятор більше не може дозволити вам підтипу безпечним способом пам’яті. Це тому, що якщо ви додасте більше членів даних до свого типу та призначите більш загальний тип, будь-які додаткові члени даних, які не вміщуються у просторі, призначеному для цільової змінної, будуть відрізані.