TURBO PASCAL

Новости

Программы   

Turbo Pascal 

Игры

Документация   

Странности

FAQ

Ссылки

Форум

Гостевая книга

Рассылка

Благодарности

Об авторе

 

 

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

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

 

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

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

Как известно, переменная имеет идентификатор, тип и размер. Естественно, что переменные различных типов могут иметь одинаковый размер (к примеру 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;

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

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

 

На первую страницу

Rambler's Top100 Rambler's Top100
PROext: Top 1000

(с)Все права защищены

По всем интересующим вопросам прошу писать на электронный адрес

Hosted by uCoz