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