Конференция "Основная" » какие накладные расходы у try except end?
 
  • Тыщ (04.04.08 11:23) [40]
    Сергей М. ©   (04.04.08 11:19) [38]

    В программе должно быть все красиво - и размер, и скорость, и структура, внешняя и внутренняя.
    Не должно быть ничего лишнего.
    Если программирование искусством считать, конечно.
    А для себя я считаю именно так.
  • Тыщ (04.04.08 11:27) [41]
    clickmaker ©   (04.04.08 11:23) [39]

    Как раз таки я и пытаюсь жонглировать паскалевскими строками, а не нуль-терминированными.
    Использую встроенный в Windows менеджер памяти (HeapAlloc, HeapFree), он не вызывает исключения, если его специально не просить.
  • Сергей М. © (04.04.08 11:30) [42]

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


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


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


    Не пользуйся типами данных с управляемым временем жизни - не будет ничего лишнего.
    Но и не хнычь при этом, мол, "pchar не хочу, асм тоже не хочу, хочу длинные строки, че за фигню мне впаривает компайлер")
  • Сергей М. © (04.04.08 11:32) [43]

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


    А как же насчет "ничего лишнего" ?
    Ведь длинные длинные строки содержат "лишний заголовок" !)
    Как же ты с этим миришься при таких амбициях ?)
  • Сергей М. © (04.04.08 11:34) [44]
    Понимаешь ли, создавать свою красоту резонно лишь полностью постигнув чужую)
  • Тыщ (04.04.08 11:34) [45]
    Сергей М. ©   (04.04.08 11:32) [43]

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

    Их размер что-ли? Так это наоборот очень хорошо - во-первых, в них можно хранить любые бинарные данные, а во-вторых, не нужно пробегать по всей строке, чтобы вычислить длину.
  • Сергей М. © (04.04.08 11:44) [46]

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


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


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

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

    Если тебе не понадобится львиная доля этих п/программ, то как насчет красоты, притом что они будут фигурировать в твоем исп.модуле мертвым грузом ?)
  • Тыщ (04.04.08 11:48) [47]
    Сергей М. ©   (04.04.08 11:44) [46]

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

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

    > ...

    Вы не правы, из "джентльменского набора" исключаются все неиспользуемые функции и не будут мертвым грузом.
  • clickmaker © (04.04.08 11:52) [48]

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

    зависит от того, кто встретит
  • Сергей М. © (04.04.08 11:54) [49]

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


    Чавой-то ?!

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


    > Вы не правы


    Где аргументы ?)
  • Тыщ (04.04.08 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

  • Тыщ (04.04.08 12:02) [51]
    Естественно, я использую свои собственные System.pas и Sysinit.pas.
  • Сергей М. © (04.04.08 12:09) [52]

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


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


    > program.map


    И где здесь аргумент, отрицающий факт присутствия в образе исп.модуля машкода, соответствующего, например, ф-ции _IntfClear ?
  • Сергей М. © (04.04.08 12:14) [53]

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


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

    Чудеса)

    Впрочем, покоцал исп.модуль ты сам, а не компилятор.
    Компилятор честно включил весь машкод сист.юнитов в будущий объектный код)
  • Сергей М. © (04.04.08 12:16) [54]

    > будущий


    Это я сморозил.
  • Тыщ (04.04.08 12:17) [55]
    Сергей М. ©   (04.04.08 12:09) [52]

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

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

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

    В program.map перечислены все используемые функции и переменные.
    Вам exe-шник показать?
  • Сергей М. © (04.04.08 12:21) [56]

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



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


    Ага.
    И исх.текст system.pas.
  • Тыщ (04.04.08 12:21) [57]
    Сергей М. ©   (04.04.08 12:14) [53]

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

    В System.pas нигде нет конструкции, отвечающей именно за блоки обработки исключений. Она защита где-то в компиляторе, то есть, в dcc32.exe.
  • Сергей М. © (04.04.08 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;

  • Тыщ (04.04.08 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

    , пожалуйста.
 
Конференция "Основная" » какие накладные расходы у try except end?
Есть новые Нет новых   [134484   +49][b:0][p:0.004]