В программах никогда не следует делать какие-либо предположения о размере определенного типа данных, но иногда нужно знать эту информацию — например, при выделении динамической памяти, использовании библиотечных процедур, при записи или архивации данных в файл.
В Objective-C имеется оператор с именем sizeof, который можно использовать для определения размера типа данных или объекта. Оператор sizeof возвращает размер указанного элемента в байтах.
Аргументом для оператора sizeof может быть переменная, имя массива, имя базового типа данных, объект, имя производного типа данных или выражение. Например, написав:
1 |
sizeof(int) |
мы получим число байтов для сохранения целого значения. На моем MacBook Air получается значение 4(то есть 32 бита). Если объявить x как массив из 100 значений типа int, то выражение:
1 |
sizeof(x) |
даст количество памяти, необходимой для сохранения 100 целых элементов массива x.
Если myFract является объектом класса Fraction, содержащим две переменных экземпляра типа int(numerator и denominator — числитель и знаменатель), то выражение:
1 |
sizeof(myFract) |
даст значение 4 на любом компьютере, где для представления указателей используются 4 байта. На самом деле sizeof дает это значение для любого объекта, потому что мы запрашиваем размер указателя на данные объекта.
Чтобы получить размер реальной структуры данных для хранения экземпляра объекта класса Fraction, нужно написать:
1 |
sizeof(*myFract) |
На моем MacBook Air это дает значение 12. Эта сумма складывается из 4 байтов для numerator, 4 байтов для denominator, плюс еще 4 байта для наследуемого компонента isa, о котором поговорим в других статьях, следите за нашим блогом. Выражение:
1 |
sizeof(struct data_entry) |
дает количество памяти, необходимой для хранения одной структуры data_entry. Если data определен как массив элементов struct data_entry, то выражение:
1 |
sizeof(data) / sizeof(struct data_entry) |
дает число элементов, содержащихся в data(data должен быть заранее определенным массивом, а не формальным параметром или массивом по внешней ссылке). Выражение:
1 |
sizeof(data) / sizeof(data[0]) |
дает тот же результат. Используйте оператор sizeof, чтобы избежать вычислений или задания фиксированных размеров в программах.