Будет ли условный вызов метода без кода включен в выходной файл? - PullRequest
3 голосов
/ 03 января 2012

У меня есть 3 вопроса, но их трудно описать, поэтому я вставил их в код:

// 1. will this method be included in the output exe file when
// there is a call for it but the LOG_ENABLED is not defined ?
procedure LogSomething;
begin
  {$IFDEF LOG_ENABLED}ShowMessage('Something is logged');{$ENDIF}
end;

// 2. will this method be included in the output exe file when
// there is no call for it ?
procedure LogSomething2;
begin
  ShowMessage('Something is logged');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  // 3. will this method call be included in the output exe file 
  // when this method has no executable code (because LOG_ENABLED 
  // is not defined) ?
  LogSomething;
end;

Спасибо за ваше время

Ответы [ 2 ]

4 голосов
/ 03 января 2012
  1. Да, хотя он может быть встроен и исчезнуть

  2. Если он не виден вне модуля (например, экспортируется как функция DLL), то нет, компилятор экономит пространство, не включая неиспользуемые функции в исполняемый файл

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

$IFDEF используется для изменения текста исходного файла до того, как компилятор его увидит. Когда вы используете $IFDEF в первом методе и LOG_ENABLED не определен, метод выглядит так для компилятора

procedure LogSomething;
begin

end;

Когда определено , оно выглядит следующим образом

procedure LogSomething;
begin
  ShowMessage('Something is logged');
end;
2 голосов
/ 03 января 2012

Вы можете проверить это самостоятельно, попытавшись установить точку останова на рассматриваемых строках и посмотреть, допустима ли точка останова.Ответ может зависеть от настроек оптимизации компилятора, для Delphi XE с настройками по умолчанию ответы да, нет, да.

...