Конференция "Основная" » какие накладные расходы у try except end?
 
  • Сергей М. © (04.04.08 09:48) [20]
    Впрочем, если геморрой на собственный зад тебя не страшит, готовь данные и вызывай функции с использованием basm, тогда компилятор махнет на твои извращения рукой)
  • Сергей М. © (04.04.08 09:49) [21]

    > С чего это?


    Он мне по секрету на ушко шепнул)
  • Тыщ (04.04.08 09:51) [22]
    Сергей М. ©   (04.04.08 9:48) [20]

    О чем и говорилось в [5]:
    > кроме переписывания кода на ассемблере

    Сергей М. ©   (04.04.08 9:49) [21]

    Ну-ну...
  • Сергей М. © (04.04.08 09:56) [23]

    > О чем и говорилось в [5]


    В [5] не было конкретностей, они появились в [6].

    А вот теперь измени декларацию своей ф-ции на следующую процедуру:

    procedure ExpandEnvironmentStrings2(var s:string);



    Удивись - компилятор не заключил вызов процедуры в try-блок !

    Теперь думай над происходящим)
  • Тыщ (04.04.08 10:06) [24]
    Сергей М. ©   (04.04.08 9:56) [23]

    Честно удивлюсь, если не заключил. У меня заключил.

    Код:
    uses Windows;
    {$APPTYPE CONSOLE}
    procedure ExpandEnvironmentStrings2(var s:string);
    var Buffer:pchar;
       Size:cardinal;
    begin
     Size:=ExpandEnvironmentStrings(pchar(s),nil,0);
     GetMem(Buffer,Size);
     Size:=ExpandEnvironmentStrings(pchar(s),Buffer,Size);
     SetString(s,Buffer,Size-1);
     FreeMem(Buffer);
    end;

    procedure Write_(var s:string);
    var Temp:dword;
    begin
     WriteFile(GetStdHandle(STD_OUTPUT_HANDLE),s[1],Length(s),Temp,nil);
    end;

    var
     s:string;
    begin
     s:='%PATH%';
     ExpandEnvironmentStrings2(s);
     Write_(s);
    end.

  • Сергей М. © (04.04.08 10:10) [25]

    > У меня заключил


    Врешь и не моргаешь)
    Или не понимаешь в принципе, какому конкретно программному действию этот блок соответствует.
  • Тыщ (04.04.08 10:19) [26]
    Сергей М. ©   (04.04.08 10:10) [25]

    >> У меня заключил
    > Врешь и не моргаешь)

    Смотрю в самое начало кода и вижу
    mov fs:[eax],esp

    . Кто врет?

    > Или не понимаешь в принципе, какому конкретно программному действию этот блок соответствует.

    Случай,
    > если возвращаемое значение есть LargeString
    мы убрали, в каких еще случаях генерируется этот блок?
    Не затруднит рассказать или хотя бы дать ссылку?
  • Сергей М. © (04.04.08 10:28) [27]

    > Смотрю в самое начало кода и вижу mov fs:[eax],esp . Кто
    > врет?


    ты, разумеется)

    Этот блок появился по факту присутствия строчки

    s:='%PATH%'



    но отнюдь не строчки

    ExpandEnvironmentStrings2(s);



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


    > в каких еще случаях генерируется этот блок?


    Во всех случаях когда компилятор берет на себя ответственность за безусловное освобождение ресурсов, распределенных под данные с управляемым временем жизни, при потенциальной возможности исключений.
  • Тыщ (04.04.08 10:43) [28]
    Сергей М. ©   (04.04.08 10:28) [27]

    Нет, виновата строка с var:

    var s:string;
    begin
    end.



    Даже тут генерируется этот блок...

    Спасибо за объяснение.

    Итак, строку можно вернуть либо функцией, либо процедурой с var string.
    В обоих случаях будет генерироваться этот блок.

    Есть ли еще способы вернуть строку (AnsiString)?
  • Сергей М. © (04.04.08 10:54) [29]

    > виновата строка с var


    Далеко не всегда.


    > В обоих случаях будет генерироваться этот блок


    Вовсе не факт.
  • Сергей М. © (04.04.08 10:56) [30]
    var
     s: string;

    procedure TForm1.Button2Click(Sender: TObject);
    begin
     s := '%PATH%';
    end;

    Удивись - никаких блоков компилятор не сгенерировал.
  • Тыщ (04.04.08 10:56) [31]
    Сергей М. ©   (04.04.08 10:54) [29]

    Приведите пример, пожалуйста.
  • Сергей М. © (04.04.08 10:58) [32]
    см. [30]
  • Тыщ (04.04.08 10:58) [33]
    Сергей М. ©   (04.04.08 10:56) [30]

    Ну да, в функции
    TForm1.Button2Click

    не будет этого блока, а в главном
    begin end.

    все равно будет.
  • Сергей М. © (04.04.08 11:03) [34]

    > в главном begin end. все равно будет


    И чем он тебе помешал ?
    Этот блок "охватит" всю работу приложения, один раз за всю его жизнь, что никак не отразится на сквозной его производительности.
  • Тыщ (04.04.08 11:07) [35]
    Сергей М. ©   (04.04.08 11:03) [34]

    > И чем он тебе помешал ?

    Давайте все-таки отвечать на заданный вопрос - "как избавиться от блока обработки исключений", а не такой вопрос - "чем тебе мешает X?"
    Если бы он мне не мешал, я бы не задавал свой вопрос, логично?
  • Сергей М. © (04.04.08 11:13) [36]
    Отвечаю - не пользовать конструкции вида [28].
  • Сергей М. © (04.04.08 11:15) [37]
    Нелогично другое - стремление к блохоловству, аргументированное лишь ничего не значащим "пишу на чистом ВинАПИ"
  • Сергей М. © (04.04.08 11:19) [38]
    Ты объясни, на чем ты хочешь сэкономить, избавившись от сабжа ?
    На размере исп.модуля ?
    На локальной/сквозной производительности приложения ?
  • clickmaker © (04.04.08 11:23) [39]

    > [35] Тыщ   (04.04.08 11:07)

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