Delphi编译器是否执行优化?

时间:2010-11-03 02:18:14

标签: delphi optimization compiler-construction compiler-optimization

我正在使用Delphi 7 IDE。 Delphi编译器是否优化代码,就像C ++编译器在以下链接中所做的那样?

http://msdn.microsoft.com/en-us/library/aa366877(VS.85).aspx

WCHAR szPassword[MAX_PATH];
// Retrieve the password
if (GetPasswordFromUser(szPassword, MAX_PATH))    
   UsePassword(szPassword);
// Clear the password from memory
SecureZeroMemory(szPassword, sizeof(szPassword));

如果在此示例中调用了ZeroMemory而不是SecureZeroMemory,则编译器可以优化调用,因为szPassword缓冲区在超出范围之前不会被读取。密码将保留在应用程序堆栈中,可以在崩溃转储中捕获或由恶意应用程序进行探测。

5 个答案:

答案 0 :(得分:12)

是的,当然Delphi会执行优化。但是,它不执行SecureZeroMemory函数旨在规避的优化。在Delphi中不需要使用该功能;只需使用普通的ZeroMemory,甚至是FillChar。它们不是宏,并且它们不执行任何Delphi认为是可以优化的未使用的赋值语句。

答案 1 :(得分:2)

Delphi默认执行代码优化,你可以在 Project>中禁用它。选项>编译器

Delphi帮助提供了一些使用何种优化的技巧:

  

$ O指令控制代码优化。在{$ O +}状态下,编译器执行许多代码优化,例如将变量放在CPU寄存器中,消除常见的子表达式,以及生成归纳变量。

它还声明“编译器不执行”不安全“优化”,但从某种意义上说它们不会改变执行路径,而不是从安全角度来看。

答案 2 :(得分:0)

我不相信编译器会像这样消除明显死的代码。我从来没有在代码上设置断点时遇到麻烦,这些代码可能已经被删除为冗余。

答案 3 :(得分:0)

对于某些情况,编译器可以检测代码是否无法访问并消除代码。

例如,编译器正确地消除了下面代码的“无法访问”部分 它不会为该行生成代码,所以:

  1. 所以没有蓝色子弹表示有代码
  2. 该行上的断点将在视觉上标记为“无法访问”
  3. 刚刚在Delphi XE中测试过,但旧的Delphi版本有类似的行为。

    program Project1;
    
    {$APPTYPE CONSOLE}
    
    uses
      SysUtils;
    
    procedure Test;
    begin
      if (True = False) then
        Writeln('Unreachable')
      else
        Writeln('Reachable');
    end;
    
    begin
      try
        Test();
      except
        on E: Exception do
          Writeln(E.ClassName, ': ', E.Message);
      end;
    end.
    

    需要花费一些时间来了解代码级别和liker级别上的优化器何时(或何时没有)。

    例如:当您启用优化时,编译器也会在不使用变量时立即删除变量 有时,它甚至消除了全局符号。 Danny Thorpe(前Delphi编译工程师和首席科学家)曾写过magic method Touch来阻止这种情况。
    只需在方法结束时调用此方法,即可在调试过程中欺骗优化器:

    procedure Touch(var arg);
    begin
    end;
    

    - 的Jeroen

答案 4 :(得分:0)

Delphi肯定会优化代码(它是一个现代的,优秀的编译器)。优化删除行的另一个例子是:

SomeFunction();  // Set breakpoint here, then step (F10)
myInt := 7;      // Next line will not hit this...
myInt := 13;     // ...but will instead skip to here

我希望通过在项目中的每个.pas文件中添加{$I MyProjectOptions.inc}来确保优化处于正确状态(并且不会意外地保持打开或关闭)。这恰好低于单位名称(位于文件顶部)。在“MyProjectOptions.inc”中,您只需添加以下代码:

// Is this a debug or non-debug build?
{$IF Defined(DEBUG)}
    {$O-}   // Turn optimization off
{$ELSEIF Defined(NDEBUG)}
    {$O+}   // Ensure optimisation is on
{$IFEND}

最后,确保在Project>的条件定义部分中定义了“DEBUG”和“NDEBUG”(或旧版Delphi中的等效物)。选项> Diectories /条件句。