Apr 16

Const в функциях

Если в функцию передаете строку и в самой функции эта строка не изменяется - объявляйте ее как const. В большинстве случаев это исключает скрытое добавление try..finally, а значит немного ускоряет работу функции.

 

Если не применять ключевое слово const, компилятор будет считать, что строка, возможно, будет меняться в функции, и добавляет скрытыю локальную переменную для хранения строки, т.е. получается примерно следующее:

function FuncName(AStr: string): Integer;

var

  lOldStr: string;

begin

  lOldStr := AStr;

  try

    // Тут код функции

  finally

    AStr := lOldStr;

  end;

end;

 

Я для себя провел небольшой тест и получилось, что при использовании const функция работает на 3-5% быстрее.


  1. oxffff
     Add karma Subtract karma  +0
    Цитировать.

    Псевдо-код не корретен.

    lOldStr := AStr; <– Не совсем корретно.

    finally
    AStr := lOldStr; <– Такого там нет. Зато есть lOldStr:=”.
    end;

    1
  2. aktuba
     Add karma Subtract karma  +0
    Цитировать.
    Комментарий автора

    oxffff, не понял, о чем ты? Что значит “не совсем корректно”? Объясни подробнее – что не так.

    2
  3. oxffff
     Add karma Subtract karma  +1
    Цитировать.

    При value передачи строки
    Происходит копирование указателя с увеличением счетчика на строку без финализации приемника (Мусор финализировать не надо). :)
    Т.е.

    pointer(lOldStr):=pointer(AStr); И вызов _LStrAddRef

    А при простом lOldStr:=AStr

    Вызывается _LStrLAsg, в котором аналогия с

    pointer(lOldStr):=pointer(AStr); И вызов _LStrAddRef

    НО + финализация приемника.

    3
  4. Bonart
     Add karma Subtract karma  +1
    Цитировать.

    >Если в функцию передаете строку и в самой функции эта строка не изменяется
    Тут есть нюанс – надо добавить “и эта строка гарантированно не изменяется ни в одной подпрограмме, вызывающей данную функцию”.
    Пример – если передать по const значение строкового свойства компонента, а в самой функции что-либо присвоить этому свойству – то const-параметр окажется вовсе и не const де-факто!

    4

Поделитесь вашими мыслями

Поддерживаемые теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>