TURBO PASCAL |
Новости
|
Приведение типов:как и зачем обманывать компиляторПриведение типов,или как обманывать компиляторКак известно, переменная имеет идентификатор, тип и размер. Естественно, что переменные различных типов могут иметь одинаковый размер (к примеру Integer и Word; размеры переменных можно посмотреть здесь), но обрабатываться различными способами. В таком случае возможно переменную одного типа рассматривать (и обрабатывать) как переменную другого типа. Для этого пользуются приведением типов. Формально приведение описывается так <новый_тип>(переменная) Следует отметить, что фактически переменная типа не меняет, а только в данном случае рассматривается компилятором как переменная другого типа, то есть во время компиляции генерируется код, обрабатывающий область памяти, в которой расположена переменная, по правилам обработки <нового_типа>. Наиболее широко приведение типов используется при работе с указателями, особенно нетипизированными: любая область памяти может быть приведена к любому из известных типов. Кроме того, по той причине, что любой указатель занимает в памяти 4 байта, приведение указателя одного типа к указателю другого типа возможно всегда. В этом случае (для типизированных указателей) область памяти, на которую ссылается указатель, рассматривается с точки зрения <нового_типа> указателя. Применение,или зачем обманывать?Действительно, обманывать нехорошо. Однако, в программировании, как, впрочем, и в реальной жизни, легким обманом можно сделать более эффективными некоторые процессы. Приведем пример. Допустим, что мы проанализировали код, создаваемый компилятором, при выполнении процедуры Delete, и он нам не понравился с точки зрения эффективности. Или мы пишем процедуру, удаляющую из строки все символы с определенным значением, как, например, здесь. В обоих случаях, длина строки изменится, и для того, чтобы проинформировать об этом, необходимо изменить нулевой байт строки. Можно сделать это стандартно и без обмана
Type
однако это потребует и дополнительной памяти, и дополнительных временных затрат. Куда проще и эффективнее
Byte(S[0]):= Byte(S[0]) - 2;
По-моему так. Такая же ситуация может возникнуть,
скажем, когда одни и те же данные нужно
рассматривать как знаковые, и, временами,
как беззнаковые. Более тонкое
использование приведения типов (указателей)
необходимо при обеспечении правильного (или
наоборот, неправильного, когда это надо)
вызова виртуальных функций в объектно-ориентированных
программах. |
(с)Все права защищены По всем интересующим вопросам прошу писать на электронный адрес |