![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как объяснить следующий код ?
массив © (2004-09-07 01:13:00)
type
PByteSet = ^TByteSet;
TByteSet = set of Byte;
var
W: Word;
...
{ если бит 3 в слове W установлен, тогда ... }
if 3 in PByteSet(@W)^ then ...
Что означает3 in PByteSet(@W)^? Эти собака, галочка, по отдельности и в целом, что значат ?
Defunct (2004-09-08 07:04:00) [1]> Ну так есть же уже PByteSet, зачем же ещё галочка ?
PByteSet = ^TByteSet
> А две галочки подряд зачем ?
Значит был указатель на указатель на данные.
массив (2004-09-08 06:54:00) [2]
> ^ - то что под указателем, другими словами - данные на которые
> указывает указатель.
Ну так есть же уже PByteSet, зачем же ещё галочка ?
PByteSet(@W)^
А две галочки подряд зачем ?
Defunct (2004-09-08 06:45:00) [3]> А что означает галочка (^) в конце ? Зачем она ?
^ - то что под указателем, другими словами - данные на которые указывает указатель.
Var P : PInteger;
I : Integer;
P := @I;
I := 1000; тоже самое, что и P^ := 1000;
массив (2004-09-08 06:17:00) [4]
> Digitman © (07.09.04 08:17) [13]
>
> > массив (07.09.04 01:13)
>
>
> PByteSet(@W)^ для компилятора означает : взять адрес (@)
> переменной W и рассматривать его как указатель (PByteSet)
> на данные типа TByteSet
А что означает галочка ( ^) в конце ? Зачем она ?
Нашёл в исходниках в модуле TypInfo.pas ещё интересную запись :
PropInfo^.PropType^^.Kind
Тут две галочки подряд. Адрес адреса ? Или что это ?
Verg (2004-09-07 08:45:00) [5]
> А с чего это word приводится к set of byte?
Там приводятся указатели на ...( word к set of byte )
DiamondShark (2004-09-07 08:39:00) [6]Оппа... А с чего это word приводится к set of byte?
Размер set of byte -- 256 бит = 32 байт.
Если уж работать с word, то тогда set of 0..15
Digitman (2004-09-07 08:17:00) [7]
> массив (07.09.04 01:13)
PByteSet(@W)^ для компилятора означает : взять адрес (@) переменной W и рассматривать его как указатель (PByteSet) на данные типа TByteSet
Sergey Kaminski (2004-09-07 04:47:00) [8]Defunct © (07.09.04 04:00) [11]
Разумеется, я комментировал только приведенный код, в котором индекс тестируемого бита известен на этапе компиляции.
btвыполняется медленнееtestгде-то в 3 раза, так что верю и насчет 30-40%.
Defunct (2004-09-07 04:00:00) [9]Sergey Kaminski © (07.09.04 03:31) [10]
вы что считаете, что там в сравнении всегда будет цифра 3?
А если там будет переменная?
Var X:Byte;
if X in PByteSet(@W)^ then
Вот какой код я вижу при выполнении сравнения с переменной (с включенной оптимизацией:
push ebp ; - это можно опустить
mov ebp,esp ; - это тоже не всчет
push ecx
mov [ebp-$01],al
mov eax, @W^
mov dl,[ebp-$01]
and edx,$FF
bt[eax],edx
jnb <To Else>
Как видите здесь медленная команда bt , и 3 обращения к стеку. А когда мы сами создадим массив масок, команда test гарантирована, независимо от того как мы будем задавать номер бита: константой или переменной.
Случай с 1 shl 3.. тоже добавит нам лишний сдвиг если на месте "3" будет переменная. Создать массив масок не так уж и сложно, а ускоряет работу процентов на 30-40% специально тестировали.
Sergey Kaminski (2004-09-07 03:31:00) [10]Да нет, ничего оно тормозить не будет. Все сведется к
asm
test byte ptr [eax],const
end;
абсолютно точно также как и в случае
((1 shl 3) and w)
причем, маска высчитается еще на этапе компиляции и заранее их считать, в общем случае, нет необходимости.
Defunct (2004-09-07 03:15:00) [11]> Что означает 3 in PByteSet(@W)^ ? Эти собака, галочка, по отдельности и в целом, что значат ?
Означает, что если у вас много таких сравнений, то программа будет очень сильно тормозить.
in работает очень медленно.
хотите нормальную скорость, создайте поразрядный массив масок.
ZMasks : Array[0..15] of Word = ($0001, $0002, $0004 $0008, $0010 и т.д.)
надо проверить 3-й бит, проверяйте:
If W and ZMasks(3)=1 Then ...
Else ...
Sergey Kaminski (2004-09-07 01:56:00) [12]А в случае 3 in PByteSet(@W)^ всё понятно сразу.
Ну так если понятно, что объяснять-то?
массив (2004-09-07 01:49:00) [13]
> Sergey Kaminski © (07.09.04 01:36) [5]
> А заодно и об операциях с битами. Кстати у Подгорецкого
> толковая есть статья об этом.
Про биты я и сам статью могу написать, только мне это ненадо.
Запись с битами выглядит нечитаемой ((1 shl 3) and w) <> 0, потому, что глядя на неё надо задуматься, что она означает. А в случае 3 in PByteSet(@W)^всё понятно сразу.
> Это я к тому, что для человека, знакомого с
> 1. Типизированными указателями
> 2. Сетами
Интуитивно тут и так понятно, что проверяется установка бита. А интересует толковое словесное объясниние, того как это происходит.
Кто-нибудь может объяснить без выпендриваний ?
Sergey Kaminski (2004-09-07 01:40:00) [14]Это я к тому, что для человека, знакомого с
1. Типизированными указателями
2. Сетами
3. Операциями с битами
приведенный тобой код полностьюпрозрачен и очевиден
Sergey Kaminski (2004-09-07 01:36:00) [15]Вместо того, чтобы восторгаться корявымвариантом с типизированным указателем и насильственным приведением к нему указателя на паременную, лучше потратить время с пользой и прочитать доку по языку, главы о этих самых указателях, сетах и прочем. Не так ли?
А заодно и об операциях с битами. Кстати у Подгорецкого толковая есть статья об этом. И тогда, я уверен, поймешь, почему вариант, приведенный jack128 и красив и достаточен.
массив (2004-09-07 01:23:00) [16]
> jack128 © (07.09.04 01:18) [3]
> массив (07.09.04 1:13)
> Хак это..Не стоит так делать.. Лудше уж if ((1 shl 3) and
> w) <> 0 then
Наоброт, мне понравилась краткость и читаемость3 in PByteSet(@W)^, в отличие от((1 shl 3) and w) <> 0
Поэтому хочу её лучше понять. Кто-нибудь может без выпендриваний, толково объяснить ?
jack128 (2004-09-07 01:18:00) [17]массив (07.09.04 1:13)
Хак это..Не стоит так делать.. Лудше уж if ((1 shl 3) and w) <> 0 then
Sergey Kaminski (2004-09-07 01:17:00) [18]лучше будет, если изучишь Language Ref.
Sergey Kaminski (2004-09-07 01:17:00) [19]а то ведь следующим вопросом будет: "а что значит var"