Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
15-1392191970
Пятница 13
2014-02-12 11:59
2014.09.14
Delphi + NEXTGEN (LLVM) = крах!


2-1381983486
i2e
2013-10-17 08:18
2014.09.14
Shift = [ssCtrl]; А если нажато несколько?


15-1391671804
alex_
2014-02-06 11:30
2014.09.14
Кладовка


15-1391758562
АндрейК
2014-02-07 11:36
2014.09.14
DelphiX


15-1390565775
DevilDevil
2014-01-24 16:16
2014.09.14
Разбираемся в кодировках





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский