Согласие на обработку персональных данных.

15.12.2018
Новая задача Как преобразовать байт в килобайт.

05.12.2018
Новые видео и статья Параграфы и выравнивание текста в HTML.

01.12.2018
Новый выпуск журнала Автоматизация и программирование.

26.11.2018
Новые видео и статья Функция Concat.

25.11.2018
Новые видео и статья Справка в Lazarus.



Раздел: Стандартные функции Паскаля

Функция SizeOf

Функция SizeOf в Паскале определяет и возвращает размер переменной или типа данных. Синтаксис:

function SizeOf(X : TAnyType) : LongInt;

Функция SizeOf возвращает размер переменной или типа данных, в байтах.

Эта функция одинаково работает как в обычном Паскале, так и в Lazarus, Delphi, FreePascal и других реализациях Паскаля.

Функцию SizeOf удобно использовать при определении размера строк, массивов, или при работе с указателями.

Как узнать размер переменной

Чтобы узнать размер переменной, в функцию надо просто передать идентификатор этой переменной. Например:

var i : Integer;
    M : array[0..15] of word;
    S : string[10]; 
    
begin

  //Выведет 4 (integer занимает 4 байта)
  WriteLn('SizeOf(i) = ', SizeOf(i));   
  
  //Выведет 32 (word занимает 2 байта)
  WriteLn('SizeOf(M) = ', SizeOf(M));   
  
  //Выведет 11 (в строке есть 0-й символ)
  WriteLn('SizeOf(S) = ', SizeOf(S));   
end.

Обратите внимание на определение размера строки. Мы объявили строку размером в 10 символов, однако функция SizeOf выведет число 11. Потому что функция SizeOf определяет истинный размер строки, то есть количество байтов, которое занимает строка в памяти. Этим данная функция отличается от функции Length, которая определяет количество символов в строке.

Почему 11, а не 10? Дело в том, что в начале каждой строки есть несимвольный элемент, который занимает один байт и содержит размер строки. Подробнее об этом рассказано здесь.

Как узнать размер типа данных

Также просто. Только вместо имени переменной в функцию надо передать имя типа данных. Например:

type TMyRec = record
  x : word;
  y : word;
  z : word;
end;

begin
  WriteLn('SizeOf(LongInt) = ', SizeOf(LongInt)); //Выведет 4
  WriteLn('SizeOf(Double) = ', SizeOf(Double));   //Выведет 8
  WriteLn('SizeOf(TMyRec) = ', SizeOf(TMyRec));   //Выведет 6
end.

Функция SizeOf и указатели

Наиболее часто функция SizeOf используется при работе с указателями и динамическими структурами данных. Потому что при работе со статическими переменными мы и так знаем их размер. Иногда требуется определить размер типа данных, потому что он может отличаться в разных реализациях языка. Но это тоже бывает редко. А вот при работе с динамическими структурами размер данных часто неизвестен, поэтому его приходится определять в программе с помощью таких функций, как SizeOf.

Пример:

type TMas = array[1..8] of integer;

var PMas  : ^TMas;

begin
  WriteLn('SizeOf(PMas) = ', SizeOf(PMas));    //Выведет 4
  WriteLn('SizeOf(PMas^) = ', SizeOf(PMas^));  //Выведет 32
end.

В этом примере мы также можем заранее определить размер блока данных, на который ссылается указатель PMas. Но это лишь демонстрация того, как работает SizeOf с указателями.

Обратите внимание на то, что первый раз выводится размер переменной-указателя. А второй раз - уже размер блока данных, на который ссылается указатель (размер массива TMas).

Более подробно об указателях я рассказал в своей книге Куда указывают указатели.

Ну а то, что будет выведено на экран в итоге работы всех рассмотренных примеров, показано на рисунке:

Как работает SizeOf


Как стать программистом 2.0 Как стать программистом 2.0

Эта книга для тех, кто хочет стать программистом. На самом деле хочет, а не просто мечтает. И хочет именно стать программистом с большой буквы, а не просто научиться кулебякать какие-то примитивные программки… Подробнее...
Инфо-МАСТЕР ®
Все права защищены ©
e-mail: mail@info-master.su

Яндекс.Метрика