Розміри типів даних в java - stack overflow російською

У книзі П. Ноутон, Г. Шілдт "Java 2. Найбільш повне керівництво" сказано наступне про розміри типів даних:

В іншому місці цієї книги сказано:

Може здатися, що використання short або byte економить пам'ять, але немає ніякої гарантії, що Java не буде внутрішньо так чи інакше розширювати ці типи до int. Пам'ятайте, що тип визначає поведінку, а не розмір. (Єдиний виняток - масиви, де тип byte гарантує використання тільки одного байта на елемент масиву, в той час як short буде забирати два байта, а int - чотири байти).

У зв'язку з вищенаведеним у мене виникло питання: що мається на увазі під словом поведінку змінних цілочисельного типу і чи дійсно, що для змінних, не повідомлених як масиви, розмір не визначений?

заданий 3 Січня '13 о 16:58

Вважаю, в даному випадку ми вступаємо в вічний конфлікт: нам хочеться думати про типах як про поведінку (на рівні логіки), але будучи сильно обмежені в ресурсах доводиться думати ще й про кількість виділеної пам'яті. В результаті народжуються компромісні варіанти і компромісні підходи думати про них.

Наприклад, за часів Сі, за стандартом існували тільки відносини типу short int <= int <= long int, все остальное являлось спецификой конкретной платформы. Это весьма шаткое положение вещей, которое было учтено в дизайне Java.

Стандартом Java Language Specification чітко задані крайні значення для типів, тобто мінімальна бітность на фізичному рівні. Наприклад, long повинен оперувати з 64-бітними значеннями, навіть якщо нижележащих апаратна платформа так не вміє.

Хто завгодно може написати свою "реалізацію" JVM або мови Java, але якщо результат не буде задовольняти специфікації назвати це "Java" вже не можна, в специфікації вся суть технології. Розглядати проблеми з такими "реалізаціями" можна, але важливо дистанціюватися від них, адже це вже не проблеми Java-платформи, а проблеми якогось стороннього рішення.

Чи можна це використовувати як-то для визначення реального залізного перфомансу? Наприклад, на 32-бітної машині long, умовно кажучи, фізично буде представлений двома інтамі, тобто код роботи з Лонг буде більш повільний. З іншого боку, при переході на 64-бітну систему програма сама починає працювати повільніше (до 20% на SPARC, 0-15% на AMD64 і EM64T) хоча б через розміру покажчика збільшився з 4 до 8 байт. Інакше кажучи, все складно.

У простому випадку правильніше пам'ятати що розмір примітивного типу - це поведінка (гарантія на діапазони значень і те, що між платформами логіка роботи з ними не розвалиться). Але пам'ятати, що в кінцевому рахунку це прошитий всередину стандарту інженерний компроміс, з яким в особливо тяжких випадках доведеться щось робити.

відповідь дан 2 Лютого '16 о 15:38

З приводу другого питання: вам необхідно знати, що існують декілька реалізацій віртуальної машини (вона називається скорочено JVM) від різних компаній. Так ось в різних JVM при виконанні коду:

змінна i може бути, або 4, або 8 байт. І це залежить від реалізації JVM.

Моє імхо і досвід підказують - поки ви не пишете програми, які працюють з мільйонами записів, не варто сильно на цьому морочитися. Краще освоювати програмування на java в цілому. Коли підійдете до межі, де програми будуть великими, ви вже будете знати, що з цим робити і як профайл код.

відповідь даний 4 Січня '13 о 7:14

Схожі статті