var p1: Person;
p1 := p; // копируется ссылка
Сравнение на равенство объектов размерного типа сравнивает их значения. В частности, две переменные типа запись равны если равны все поля этих записей.
type PersonRec = record
name: string;
age: integer;
end;
var p,p1: PersonRec;
p.name := 'Иванов'; p.age := 20;
p1.name := 'Иванов'; p1.age := 20;
writeln(p1 = p); // True
При сравнении на равенство переменных ссылочного типа проверяется, что они ссылаются на один и тот же объект.
var p := new Person('Иванов',20);
var p1 := new Person('Иванов',20);
writeln(p1=p); // False
Размерные типы распределяются на программном стеке, поэтому не нуждаются в специальном управлении памятью. Под глобальные размерные переменные память распределена всё время работы программы. Под локальные размерные переменные память выделяется в момент вызова подпрограммы. а освобождается в момент завершения работы этой подпрограммы.
Управление памятью для ссылочных типов осуществляется автоматически сборщиком мусора. Сборщик мусора запускается в неопределенный момент времени когда управляемой памяти перестаёт хватать. Он возвращает в пул неиспользуемой памяти те объекты, на которые больше никто не ссылается, после чего дефрагментирует оставшуюся память, в результате чего динамическая память всегда дефрагментирована и ее выделение при вызове конструктора происходит практически мгновенно.
При передаче размерных типов по значению происходит копирование значения фактического параметра в переменную-формальный параметр. Если размерный тип имеет большой размер, это может занимать продолжительное время, поэтому размерный тип в этом случае передаётся по ссылке на константу:
type Arr = array [1..100] of integer;
procedure PrintArray(const a: Arr; n: integer);
begin
for var i:=1 to n do
Print(a[i])
end;
Ссылочные типы передаются в подпрограмму, как правило, по значению. При передаче таких параметров происходит копирование ссылки, в результате формальный и фактический параметр будут ссылаться на один объект.
procedure Change666(a: array of integer);
begin
a[0] := 666;
end;
При этом в результате изменения формального параметра внутри подпрограммы меняется и содержимое соответствующего фактического параметра при вызове подпрограммы.
Целые типы
Ниже приводится таблица целых типов, содержащая также их размер и диапазон допустимых значений.
Тип | Размер, байт | Диапазон значений |
shortint | 1 | -128..127 |
smallint | 2 | -32768..32767 |
integer, longint | 4 | -2147483648..2147483647 |
int64 | 8 | -9223372036854775808..9223372036854775807 |
byte | 1 | 0..255 |
word | 2 | 0..65535 |
longword, cardinal | 4 | 0..4294967295 |
uint64 | 8 | 0..18446744073709551615 |
BigInteger | переменный | неограниченный |
Типы integer и longint, а также longword и cardinal являются синонимами.
Максимальные значения для каждого целого типа определены как внешние стандартные константы: MaxInt64, MaxInt, MaxSmallInt, MaxShortInt, MaxUInt64, MaxLongWord, MaxWord, MaxByte.
Для каждого целого типа T кроме BigInteger определены следующие константы как статические члены: