Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2009.02.01;
Скачать: [xml.tar.bz2];

Вниз

какие накладные расходы у try except end?   Найти похожие ветки 

 
Тыщ   (2008-04-04 11:23) [40]

Сергей М. ©   (04.04.08 11:19) [38]

В программе должно быть все красиво - и размер, и скорость, и структура, внешняя и внутренняя.
Не должно быть ничего лишнего.
Если программирование искусством считать, конечно.
А для себя я считаю именно так.


 
Тыщ   (2008-04-04 11:27) [41]

clickmaker ©   (04.04.08 11:23) [39]

Как раз таки я и пытаюсь жонглировать паскалевскими строками, а не нуль-терминированными.
Использую встроенный в Windows менеджер памяти (HeapAlloc, HeapFree), он не вызывает исключения, если его специально не просить.


 
Сергей М. ©   (2008-04-04 11:30) [42]


> В программе должно быть все красиво


У тебя искаженные представления о красоте.


> Не должно быть ничего лишнего


Не пользуйся типами данных с управляемым временем жизни - не будет ничего лишнего.
Но и не хнычь при этом, мол, "pchar не хочу, асм тоже не хочу, хочу длинные строки, че за фигню мне впаривает компайлер")


 
Сергей М. ©   (2008-04-04 11:32) [43]


> пытаюсь жонглировать паскалевскими строками


А как же насчет "ничего лишнего" ?
Ведь длинные длинные строки содержат "лишний заголовок" !)
Как же ты с этим миришься при таких амбициях ?)


 
Сергей М. ©   (2008-04-04 11:34) [44]

Понимаешь ли, создавать свою красоту резонно лишь полностью постигнув чужую)


 
Тыщ   (2008-04-04 11:34) [45]

Сергей М. ©   (04.04.08 11:32) [43]

> Ведь длинные длинные строки содержат "лишний заголовок" !)

Их размер что-ли? Так это наоборот очень хорошо - во-первых, в них можно хранить любые бинарные данные, а во-вторых, не нужно пробегать по всей строке, чтобы вычислить длину.


 
Сергей М. ©   (2008-04-04 11:44) [46]


> Тыщ   (04.04.08 11:34) [45]


> в них можно хранить любые бинарные данные


Ты их и в нуль-терминированной строке хранить можешь, ничто этому не препятствует.

Там еще и сч-к имеется, а к работе со сч-ками (и не только с ним) тебе прилагается довольно увесистый "джентльменский набор" подпрограмм в составе system.pas.

Если тебе не понадобится львиная доля этих п/программ, то как насчет красоты, притом что они будут фигурировать в твоем исп.модуле мертвым грузом ?)


 
Тыщ   (2008-04-04 11:48) [47]

Сергей М. ©   (04.04.08 11:44) [46]

> Ты их и в нуль-терминированной строке хранить можешь, ничто этому не препятствует.

Встретится там #0, и обрежет строку.

> ...

Вы не правы, из "джентльменского набора" исключаются все неиспользуемые функции и не будут мертвым грузом.


 
clickmaker ©   (2008-04-04 11:52) [48]


> Встретится там #0, и обрежет строку.

зависит от того, кто встретит


 
Сергей М. ©   (2008-04-04 11:54) [49]


> Встретится там #0, и обрежет строку


Чавой-то ?!

Какая такая "обрежет", если ты сознательно работаешь с буфером строки как с областью памяти, содержащей произвольные бин.данные ?


> Вы не правы


Где аргументы ?)


 
Тыщ   (2008-04-04 12:01) [50]

Сергей М. ©   (04.04.08 11:54) [49]

> Какая такая "обрежет", если ты сознательно работаешь с буфером строки как с областью памяти, содержащей произвольные бин.данные ?

Буфер - это уже не нуль-терминированная строка, и размер его вычисляется не позицией #0.

>> исключаются все неиспользуемые функции
> Где аргументы ?)

var s:string;
begin
 s:="Test";
end.


program.map:

 Address         Publics by Value

0001:00000000       @GetMem
0001:00000010       @FreeMem
0001:00000020       Move
0001:00000080       @LStrAsg
0001:000000C4       @NewAnsiString
0001:000000F0       ExitProcess
0001:000000F8       GetProcessHeap
0001:00000100       HeapAlloc
0001:00000108       HeapFree
0001:00000110       System
0001:00000114       SysInit
0001:00000138       PROGRAM
0002:00001000       s


 
Тыщ   (2008-04-04 12:02) [51]

Естественно, я использую свои собственные System.pas и Sysinit.pas.


 
Сергей М. ©   (2008-04-04 12:09) [52]


> размер его вычисляется не позицией #0


А кто тебя заставляет пользоваться п/программами, занимающимися именно  таким вычислением ?


> program.map


И где здесь аргумент, отрицающий факт присутствия в образе исп.модуля машкода, соответствующего, например, ф-ции _IntfClear ?


 
Сергей М. ©   (2008-04-04 12:14) [53]


> я использую свои собственные System.pas и Sysinit.pas


И при этом компилятор упорно вставляет блок и все работает ?
Даже если в покоцаном system нет ни намека на п/п HandleFinally ?

Чудеса)

Впрочем, покоцал исп.модуль ты сам, а не компилятор.
Компилятор честно включил весь машкод сист.юнитов в будущий объектный код)


 
Сергей М. ©   (2008-04-04 12:16) [54]


> будущий


Это я сморозил.


 
Тыщ   (2008-04-04 12:17) [55]

Сергей М. ©   (04.04.08 12:09) [52]

> А кто тебя заставляет пользоваться п/программами, занимающимися именно  таким вычислением ?

Давайте закончим обсуждение нуль-терминированных строк на том, что в нуль-терминированной строке нельзя хранить бинарные данные, содержащие нули.

> И где здесь аргумент, отрицающий факт присутствия в образе исп.модуля машкода, соответствующего, например, ф-ции _IntfClear ?

В program.map перечислены все используемые функции и переменные.
Вам exe-шник показать?


 
Сергей М. ©   (2008-04-04 12:21) [56]


> Тыщ   (04.04.08 12:17) [55]



> exe-шник показать?


Ага.
И исх.текст system.pas.


 
Тыщ   (2008-04-04 12:21) [57]

Сергей М. ©   (04.04.08 12:14) [53]

>И при этом компилятор упорно вставляет блок и все работает ?
>Даже если в покоцаном system нет ни намека на п/п HandleFinally ?

В System.pas нигде нет конструкции, отвечающей именно за блоки обработки исключений. Она защита где-то в компиляторе, то есть, в dcc32.exe.


 
Сергей М. ©   (2008-04-04 12:31) [58]


> Она защита где-то в компиляторе


Да ты что ?!

А мужики-то и не знали)

И это они сами придумали:


procedure       _HandleFinally;
asm
{$IFDEF PC_MAPPED_EXCEPTIONS}
{$IFDEF PIC}
       MOV     ESI, EBX
{$ENDIF}
       CMP     ECX, UW_EXC_CLASS_BORLANDCPP    // C++ exception?
       JNE     @@handleIt                      // nope, handle it
       // unwinding a C++ exception.  We handle that specially.
       PUSH    EAX
       PUSH    EDX
       PUSH    ECX
       MOV     EDX, [ESP+12]
       CALL    EDX
       POP     ECX
       POP     EDX
       POP     EAX
       CALL    SysRaiseCPPException

@@handleIt:
       PUSH    EAX
       PUSH    EDX
       CALL    UnblockOSExceptions
       POP     EDX
       POP     EAX

       // If the exception is a Delphi exception thrown from C++, coopt it.
       CALL    MaybeCooptException

       MOV     EDX, [ESP]
       CALL    NotifyExceptFinally
       PUSH    EAX
{$IFDEF PIC}
       MOV     EBX, ESI
{$ENDIF}
       {
         Mark the current exception with the EBP of the handler.  If
         an exception is raised from the finally block, then this
         exception will be orphaned.  We will catch this later, when
         we clean up the next except block to complete execution.
         See DoneExcept.
       }
       MOV [EAX].TRaisedException.HandlerEBP, EBP
       CALL    EDX
       POP     EAX
       {
         We executed the finally handler without adverse reactions.
         It"s safe to clear the marker now.
       }
       MOV [EAX].TRaisedException.HandlerEBP, $FFFFFFFF
       PUSH    EBP
       MOV     EBP, ESP
       CALL    SysRaiseException             // Should be using resume here
{$ENDIF}
{$IFDEF MSWINDOWS}
       { ->    [ESP+ 4] excPtr: PExceptionRecord       }
       {       [ESP+ 8] errPtr: PExcFrame              }
       {       [ESP+12] ctxPtr: Pointer                }
       {       [ESP+16] dspPtr: Pointer                }
       { <-    EAX return value - always one   }

       MOV     EAX,[ESP+4]
       MOV     EDX,[ESP+8]
       TEST    [EAX].TExceptionRecord.ExceptionFlags,cUnwindInProgress
       JE      @@exit
       MOV     ECX,[EDX].TExcFrame.desc
       MOV     [EDX].TExcFrame.desc,offset @@exit

       PUSH    EBX
       PUSH    ESI
       PUSH    EDI
       PUSH    EBP

       MOV     EBP,[EDX].TExcFrame.hEBP
       ADD     ECX,TExcDesc.instructions
       CALL    NotifyExceptFinally
       CALL    ECX

       POP     EBP
       POP     EDI
       POP     ESI
       POP     EBX

@@exit:
       MOV     EAX,1
{$ENDIF}
end;


 
Тыщ   (2008-04-04 12:36) [59]

Сергей М. ©   (04.04.08 12:21) [56]

>> exe-шник показать?
>Ага.

http://tysch.narod.ru/test10.zip

System.pas пока что не могу показать.

Сергей М. ©   (04.04.08 12:31) [58]

Ткните меня носом, где написано mov fs:[eax],esp, пожалуйста.


 
Сергей М. ©   (2008-04-04 12:47) [60]


> System.pas пока что не могу показать


А без него сравнение бессмысленно.
Так что будем пока считать твои утверждения голословными)


> где написано mov fs:[eax],esp


Причем здесь это ? Это само собой.

Я про код финализации защищаемого блока, обращение к которому компилятор обязательно будет пытаться вставить в результ.код.

А к чему обращаться-то, если ты покоцал system и выкорчевал оттуда все непонятное и посему якобы ненужное ?)


 
Игорь Шевченко ©   (2008-04-04 13:01) [61]


> Причем здесь это ? Это само собой.


Это не само собой. Это именно то, что делает компилятор при встрече конструкции try...{finally|except} - вставляет формирование блока обработки исключительной ситуации - N команд в начале блока, N команд в конце.


 
Тыщ   (2008-04-04 13:01) [62]

Сергей М. ©   (04.04.08 12:47) [60]

> Причем здесь это ? Это само собой.
> Я про код финализации защищаемого блока, обращение к которому компилятор обязательно будет пытаться вставить в результ.код.

А причем здесь код финализации? Я про него вообще не говорил.
Я говорил про блок обработки исключений, а он зашит в компиляторе. С чем не согласны?

http://tysch.narod.ru/test11.zip
Вот, убедитесь, никакого _IntfClear там нет.


 
Сергей М. ©   (2008-04-04 13:11) [63]


> Я про него вообще не говорил.
> Я говорил про блок обработки исключений


Да мало ли что там еще "зашито")


> http://tysch.narod.ru/test11.zip


 403  
Нет главной страницы

Ой
В разделе сайта, к которому вы обратились, нет главной страницы


 
Тыщ   (2008-04-04 13:15) [64]

Сергей М. ©   (04.04.08 13:11) [63]

Не надо, а? Все отлично открывается.


 
Сергей М. ©   (2008-04-04 13:15) [65]


> Игорь Шевченко ©   (04.04.08 13:01) [61]


А никто и не возражает, даже если это неявный try-блок


 
Сергей М. ©   (2008-04-04 13:22) [66]


> Тыщ   (04.04.08 13:15) [64]


ну любуйся сам, раз открывается)

Помощь вообще-то  тебе нужна, а не мне)


 
Тыщ   (2008-04-04 13:27) [67]

Сергей М. ©   (04.04.08 13:22) [66]

Я сомневаюсь, что ссылка не работает - другу дал проверить, работает.
Есть другие предложения, как вам этот файл передать?


 
Сергей М. ©   (2008-04-04 13:28) [68]

slil.ru

Кидай туда - и 1-ю и 2-ю (обе не открываются)


 
Eraser ©   (2008-04-04 13:32) [69]


> Тыщ   (04.04.08 11:23) [40]
> Сергей М. ©   (04.04.08 11:19) [38]В программе должно быть
> все красиво - и размер, и скорость, и структура, внешняя
> и внутренняя.Не должно быть ничего лишнего.Если программирование
> искусством считать, конечно.

потому и не надо изобретать велосипды.

сочувствую человеку, который будет разбираться в этом коде потом..
видал я тварения таких любителей красоты, блин..

код должен быть красив и по-возможности решать задачу, для выполнения которой и написана программа, а не выполнять обслуживающие действия, для которых как раз и придуман VCL.


 
Eraser ©   (2008-04-04 13:34) [70]


> Тыщ   (04.04.08 13:27) [67]

не работает.


 
Сергей М. ©   (2008-04-04 13:35) [71]


> Eraser ©   (04.04.08 13:34) [70]
>
>


Значит ты не друг)


 
Тыщ   (2008-04-04 13:36) [72]

Сергей М. ©   (04.04.08 13:28) [68]

http://slil.ru/25652671


 
palva ©   (2008-04-04 13:41) [73]


> > Тыщ   (04.04.08 13:27) [67]
Narod не хочет отдавать файл, отмазывается, что в разделе нет главной страницы.


 
Тыщ   (2008-04-04 13:42) [74]

palva ©   (04.04.08 13:41) [73]

А она там есть, index.html.


 
Сергей М. ©   (2008-04-04 14:09) [75]


> Тыщ


Так.
Посмотрел.

Все верно - ты покоцал тела всех п/программ, относящихся к сабжу, после чего скомпилил юнит. В результате объектный код таких п/программ в system.dcu превратился в одну-единственную инструкцию RETN.

При компиляции проекта компилятор справедливо заменил инструкцию вызова таких "затычек" на непосредственно инструкцию RETN.

Т.е. ты поменял шило на мыло)


 
Тыщ   (2008-04-04 14:16) [76]

Сергей М. ©   (04.04.08 14:09) [75]

Ну, убедились, что _IntfClear там нет?

От "затычек" я избавился (от большинства) в test10.
Вопрос прежний -
> Есть ли еще способы вернуть строку (AnsiString)?


 
Сергей М. ©   (2008-04-04 14:17) [77]

Маньяк !)

Начисто выбрил весь код, имеющий отношение к SEH, но при этом оставил огромную кучу "хлама", явно не требуемого при "пишу на чистом ВинАПИ"

))


 
Тыщ   (2008-04-04 14:18) [78]

Сергей М. ©   (04.04.08 14:17) [77]

> оставил огромную кучу "хлама"

Например?


 
Сергей М. ©   (2008-04-04 14:20) [79]


> Тыщ   (04.04.08 14:16) [76]


> убедились, что _IntfClear там нет?


Ну ты и фрукт)

На момент, когда я упомянул _IntfClear, предполагалось что ты пользуешь штатный system.dcu, а не выбритый лоскутами)


 
Сергей М. ©   (2008-04-04 14:22) [80]


> Например?


Дык тот же TObject и иже с ним потроха занимают немало места !
Некузяво как-то) .. Выбрей и его тож)



Страницы: 1 2 3 вся ветка

Форум: "Основная";
Текущий архив: 2009.02.01;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.63 MB
Время: 0.009 c
2-1229535561
smartleds
2008-12-17 20:39
2009.02.01
Ошибка при сохранении файла


8-1190149689
vr-online
2007-09-19 01:08
2009.02.01
Сфера и Текстура


15-1228647249
Slider007
2008-12-07 13:54
2009.02.01
С днем рождения ! 6 декабря 2008 суббота


15-1228473709
GanibalLector
2008-12-05 13:41
2009.02.01
работа с девайсом по GPRS. Как ???


15-1228576006
Artem
2008-12-06 18:06
2009.02.01
Литература COM в Delphi





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский