Форум: "Прочее";
Текущий архив: 2014.09.14;
Скачать: [xml.tar.bz2];
ВнизПользуетесь ли вы absolute? Найти похожие ветки
← →
ё (2014-01-28 04:11) [40]соврал
точнее не знал
procedure TForm5.Button1Click(Sender: TObject);
begin
Sender := nil;
TButton(sender).Font.Color := clRed;
end;
procedure TForm5.Button2Click(Sender: TObject);
var
b : TButton;
begin
Sender := nil;
b := Sender as TButton;
b.Font.Color := clRed;
end;
одинаково ведут
← →
Германн © (2014-01-28 04:45) [41]
> ё (28.01.14 04:11) [40]
>
> соврал
> точнее не знал
> procedure TForm5.Button1Click(Sender: TObject);
> begin
> Sender := nil;
> TButton(sender).Font.Color := clRed;
> end;
>
> procedure TForm5.Button2Click(Sender: TObject);
> var
> b : TButton;
> begin
> Sender := nil;
> b := Sender as TButton;
> b.Font.Color := clRed;
> end;
> одинаково ведут
Неправильный пример для демонстрации различия этих вариантов приведения типа. As проверяет соответствие типов, а не равенство nil.
← →
ё (2014-01-28 05:01) [42]
> As проверяет соответствие типов, а не равенство nil.
в данном контексте это одинаково
← →
ё (2014-01-28 05:05) [43]
> Неправильный пример для демонстрации различия этих вариантов
> приведения типа. As проверяет соответствие типов, а не равенство
> nil.
а пример как раз правильный
только толи я не правильно помню, толи хе2 не правильно компилит
естественно думаю, что я не прав
← →
й (2014-01-28 08:27) [44]ё, замени в обоих случаях "Sender := nil;" на "Sender := Form5;" - и увидишь разницу!
по вопросу ТС: есть мнение, что объявление переменной (указание её типа) по месту использования (как в С-подобных языках) удобнее тем, что при чтении кода не нужно искать/перескакивать глазами к месту объявления (как в паскале), то есть понимание кода происходит быстрее
по этой же причине приведение типа по месту ("TButton(Sender)") удобнее, чем absolute в секции определения переменных - быстрее прочитать и понять (а "Sender as TButton" еще и безопаснее, но это уже другой вопрос)
если преобразование нужно в нескольких местах - мнений о правильном решении много, но лучше иметь в виду, что обычный "индустриальный" код пишется только 1 раз, а читается всяко больше одного раза - и, в вобщем то, от отсутствия with...do чтение нисколько не страдает
(если повторений уж очень много - я за дополнительную локальную переменную)
← →
Дмитрий Белькевич (2014-01-28 18:08) [45]>передавай по указателю/ссылке - так быстрее :)
Итак в регистрах - куда быстрее? :)
← →
Стенка © (2014-01-28 19:57) [46]сюда быстрее )
procedure InverseByteOrder(var i: int64);
asm
mov ecx, [eax]
mov edx, [eax+4]
bswap ecx
bswap edx
mov [eax], edx
mov [eax+4], ecx
end;
← →
Германн © (2014-01-28 20:20) [47]
> ё (28.01.14 05:05) [43]
>
>
> > Неправильный пример для демонстрации различия этих вариантов
> > приведения типа. As проверяет соответствие типов, а не
> равенство
> > nil.
>
> а пример как раз правильный
>
Пример неправилен тем, что для приведения типов абсолютно неважно указывает ссылка на nil или не nil.
← →
bems © (2014-01-29 00:36) [48]
> Почему явно не привести с присвоением в отдельный указатель?
> Экономия 4 (8) байт на стеке?
и операции копирования :)
вообще вопрос поставлен неправильно. почему я должен пользоваться сабжем только в случае если мне не подходит присваивание в отдельный указатель? что если я буду каждый раз когда вижу как кто-то копирует в отдельный указатель спрашивать "а почему не заюзать absolute?"
есть такая фича в языке, вот я и пользуюсь. жаль что нельзя по-первых использовать в случае двух глобальных переменных, во-вторых когда объявляется локальная, а после absolute указывается глобальная
← →
bems © (2014-01-29 00:36) [49]
> Почему явно не привести с присвоением в отдельный указатель?
> Экономия 4 (8) байт на стеке?
и операции копирования :)
вообще вопрос поставлен неправильно. почему я должен пользоваться сабжем только в случае если мне не подходит присваивание в отдельный указатель? что если я буду каждый раз когда вижу как кто-то копирует в отдельный указатель спрашивать "а почему не заюзать absolute?"
есть такая фича в языке, вот я и пользуюсь. жаль что нельзя по-первых использовать в случае двух глобальных переменных, во-вторых когда объявляется локальная, а после absolute указывается глобальная
← →
ё (2014-01-29 00:43) [50]
> Пример неправилен тем, что для приведения типов абсолютно
> неважно указывает ссылка на nil или не nil.
вот зачем ты ерунду сейчас несешь?
← →
bems © (2014-01-29 00:44) [51]
> аль что нельзя по-первых использовать в случае двух глобальных
> переменных, во-вторых когда объявляется локальная, а после
> absolute указывается глобальная
щас проверил - скомпилилось. с чего я это взял...
← →
Дмитрий СС (2014-01-29 12:14) [52]
> есть такая фича в языке, вот я и пользуюсь.
Ну goto тоже есть в языке, если бы я спросил пользуетесь ли вы goto, думаю, ветку бы уже закрыли:)
← →
clickmaker © (2014-01-29 12:17) [53]> пользуетесь ли вы goto
я в коде хранимок на sql пользовался )
← →
DevilDevil © (2014-01-29 12:22) [54]goto рулит
Кроме того, как показывает практика, Delphi эффективнее компилирует "бесконечный цикл" если его реализовать через goto, а не через while true do
← →
DevilDevil © (2014-01-29 12:26) [55]> Стенка © (28.01.14 19:57) [46]
> сюда быстрее )
быстрее всего так
ибо возможно, что человеку нужно сохранить в другой место (памяти) или проделать иные манипуляции :)function InverseByteOrder(X: PInt64): int64;
asm
mov edx, [eax]
mov eax, [eax+4]
bswap edx
bswap eax
end;
← →
Стенка © (2014-01-29 12:46) [56]> DevilDevil © (29.01.14 12:26) [55]
> быстрее всего так
так оно быстрее в вакууме, а в реале результат ему в памяти нужен
← →
DevilDevil © (2014-01-29 12:54) [57]
var
Src, Dest: p8bytes;
begin
...
// your
pint64(Dest)^ := pint64(Src)^; // 10 ticks
Стенка.InverseByteOrder(pint64(Dest)^); // excess 6 ticks
// my
pint64(Dest)^{6 ticks} := DevilDevil.InverseByteOrder(pint64(Src));
end
← →
Стенка © (2014-01-29 12:59) [58]> DevilDevil © (29.01.14 12:54) [57]
че за ... на ровном месте? поставь мнеvar
Src, Dest: int64;
← →
Стенка © (2014-01-29 13:03) [59]ну т.е. оставь просто один оператор, без всяких своих выдуманных пересылок, нафиг ненужных автору:
InverseByteOrder(i);
← →
DevilDevil © (2014-01-29 13:08) [60]
var
Src, Dest: int64;
begin
...
// your
Dest:= Src; // 10 ticks
Стенка.InverseByteOrder(Dest); // excess 6 ticks
// my
Dest^{6 ticks} := DevilDevil.InverseByteOrder(@Src);
end
← →
Стенка © (2014-01-29 13:11) [61][59], блин!
← →
Стенка © (2014-01-29 13:15) [62]И не на пустом цикле гоняй, а с нагрузкой на другую память. В моем коде запись в память производится раньше, что полюбому лучше.
← →
bems © (2014-01-29 17:13) [63]
> Ну goto тоже есть в языке, если бы я спросил пользуетесь
> ли вы goto, думаю, ветку бы уже закрыли:)
довольно редко, но пользуюсь в качестве Break(n)
← →
Германн © (2014-01-29 20:24) [64]
> bems © (29.01.14 17:13) [63]
>
>
> > Ну goto тоже есть в языке, если бы я спросил пользуетесь
> > ли вы goto, думаю, ветку бы уже закрыли:)
>
> довольно редко, но пользуюсь в качестве Break(n)
>
А чем хуже Continue и Exit?
← →
bems © (2014-01-29 20:31) [65]не понял вопроса. они тут каким боком?
← →
Германн © (2014-01-29 20:34) [66]
> bems © (29.01.14 20:31) [65]
>
> не понял вопроса. они тут каким боком?
>
Они те же goto, что и Break.
← →
bems © (2014-01-29 20:41) [67]может непонятно выразился.
я пользуюсь goto для выхода из нескольких вложенных циклов, там где кроме простого break мне понадобилось бы завести дополнительную переменную или вынести вложенный цикл в подпрограмму. Как тут могут помочь Continue и Exit?
← →
Jeer © (2014-01-29 20:57) [68]>может непонятно выразился.
Имелось в виду, что все эти операторы цикла сводятся по сути к специализированным goto.
С другой стороны, goto всегда предполагает предельно развернутый код, что отнюдь не способствует "зрелищности" последнего.
← →
Германн © (2014-01-29 21:01) [69]
> bems © (29.01.14 20:41) [67]
>
> может непонятно выразился.
Наверно.
А также про "все эти операторы цикла".
P.S.
На винграде ты был бы более осторожен в формулировках. :)
← →
Inovet © (2014-01-29 21:14) [70]> [52] Дмитрий СС (29.01.14 12:14)
> Ну goto тоже есть в языке, если бы я спросил пользуетесь
> ли вы goto, думаю, ветку бы уже закрыли:)
Вот щас и закроют, потому что готу обсуждался 100500 раз.
← →
bems © (2014-01-29 21:23) [71]
> Имелось в виду, что все эти операторы цикла сводятся по
> сути к специализированным goto.
ну это какбы не новость, но речь-то не об этом
> С другой стороны, goto всегда предполагает предельно развернутый
> код, что отнюдь не способствует "зрелищности" последнего.
вот тут не понял. что значит развернутый?
> На винграде ты был бы более осторожен в формулировках
не, такой же
← →
antonn © (2014-01-29 21:33) [72]
> На винграде ты был бы более осторожен в формулировках. :
> )
он комодератор http://forum.vingrad.ru/users/bems
← →
Германн © (2014-01-29 22:05) [73]
> antonn © (29.01.14 21:33) [72]
А то я не знаю. Он даже как-то имел счастье забанить меня на трое суток за непочтительное отношение к своей персоне. :)
Но то давно было.
← →
Jeer © (2014-01-29 22:42) [74]>bems © (29.01.14 21:23) [71]
>вот тут не понял. что значит развернутый?
Не так давно, вполне себе "штанистый" Ega тоже "взбрыкнул" по поводу развертывания цикла.
Так вот, развертывание кода в целом - это еще более эпическое действо:)
← →
[ВладОшин] © (2014-01-30 00:11) [75]дык, его ж не продают уже вроде? 6)
← →
Германн © (2014-01-30 00:27) [76]
> [ВладОшин] © (30.01.14 00:11) [75]
>
> дык, его ж не продают уже вроде? 6)
>
Кого? За сколько? Кто последний?
:)
← →
Дмитрий Белькевич (2014-01-30 01:11) [77]Плохо, что нельзя в регистрах передать и вернуть. По крайней мере - у меня не получилось написать так, что бы Delphi передала данные в регистрах и забрала из них же.
На 64-х битном компиляторе лучше:
function InverseByteOrder(i: int64): int64;
asm
mov rax, rcx
bswap rax
end;
← →
Дмитрий Белькевич (2014-01-30 01:14) [78]Посмотрел - в [35] данные -то возвращаются в регистрах. Но Delphi опять их в память кладет.
← →
DevilDevil © (2014-01-30 01:49) [79]Плохо, что в дельфи нет интринсинков, в частности bswap
Тогда и функцию не нужно было бы вызывать :)
← →
NoUser © (2014-01-30 17:20) [80]> Дмитрий Белькевич (30.01.14 01:11) [77],[78]
function InverseByteOrderR(qH,qL:Cardinal):UInt64;
asm
BSWAP EDX
BSWAP EAX
end;
var
p:Int64;
begin
p:=InverseByteOrderR($80706050,$40302010)+1;
end.
:: p:=InverseByteOrderR($80706050,$40302010)+1;
0041A3CC BA10203040 mov edx,$40302010
0041A3D1 B850607080 mov eax,$80706050
0041A3D6 E86DD3FFFF call InverseByteOrderR
0041A3DB 83C001 add eax,$01
0041A3DE 83D200 adc edx,$00
> Но Delphi опять их в память кладет.
А что, нужно выбросить в мусор?
> DevilDevil © (30.01.14 01:49) [79]
> Плохо, что в дельфи нет интринсинков, в частности bswap
> Тогда и функцию не нужно было бы вызывать :)
Плохо, что нельзя заинлайнить асм, - тогда и функцию не нужно было бы вызывать!
Страницы: 1 2 3 вся ветка
Форум: "Прочее";
Текущий архив: 2014.09.14;
Скачать: [xml.tar.bz2];
Память: 0.61 MB
Время: 0.006 c