Pascal для стУдентов Общая информация о центре
Дырка Электронные учебники
Методические пособия
Электронные тренажеры
Программы по конкретным дисциплинам
Оглавление
 

Приведение типов:

как и зачем обманывать компилятор

Предыдущий Следующий

Приведение типов,

или как обманывать компилятор

Как известно, переменная имеет идентификатор, тип и размер. Естественно, что переменные различных типов могут иметь одинаковый размер (к примеру Integer и Word; размеры переменных можно посмотреть здесь), но обрабатываться различными способами. В таком случае возможно переменную одного типа рассматривать (и обрабатывать) как переменную другого типа. Для этого пользуются приведением типов. Формально приведение описывается так

<новый_тип>(переменная)

Следует отметить, что фактически переменная типа не меняет, а только в данном случае рассматривается компилятором как переменная другого типа, то есть во время компиляции генерируется код, обрабатывающий область памяти, в которой расположена переменная, по правилам обработки <нового_типа>. Наиболее широко приведение типов используется при работе с указателями, особенно нетипизированными: любая область памяти может быть приведена к любому из известных типов. Кроме того, по той причине, что любой указатель занимает в памяти 4 байта, приведение указателя одного типа к указателю другого типа возможно всегда. В этом случае (для типизированных указателей) область памяти, на которую ссылается указатель, рассматривается с точки зрения <нового_типа> указателя.

Применение,

или зачем обманывать?

Действительно, обманывать нехорошо. Однако, в программировании, как, впрочем, и в реальной жизни, легким обманом можно сделать более эффективными некоторые процессы. Приведем пример. Допустим, что мы проанализировали код, создаваемый компилятором, при выполнении процедуры Delete, и он нам не понравился с точки зрения эффективности. Или мы пишем процедуру, удаляющую из строки все символы с определенным значением, как, например, здесь. В обоих случаях, длина строки изменится, и для того, чтобы проинформировать об этом, необходимо изменить нулевой байт строки. Можно сделать это стандартно и без обмана

Type
    PB = ^Byte;
Var
    S: String;
    P: PB;
{ . . . } Begin
    P:= Addr(S);
    P^:= P^-2; {уменьшаем длину строки}
End;

однако это потребует и дополнительной памяти, и дополнительных временных затрат. Куда проще и эффективнее

Byte(S[0]):= Byte(S[0]) - 2;

По-моему так.

Такая же ситуация может возникнуть, скажем, когда одни и те же данные нужно рассматривать как знаковые, и, временами, как беззнаковые. Более тонкое использование приведения типов (указателей) необходимо при обеспечении правильного (или наоборот, неправильного, когда это надо) вызова виртуальных функций в объектно-ориентированных программах.

Предыдущий Наверх Следующий
Оглавление
Hosted by uCoz