我正在使用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
缓冲区在超出范围之前不会被读取。密码将保留在应用程序堆栈中,可以在崩溃转储中捕获或由恶意应用程序进行探测。
答案 0 :(得分:12)
是的,当然Delphi会执行优化。但是,它不执行SecureZeroMemory
函数旨在规避的优化。在Delphi中不需要使用该功能;只需使用普通的ZeroMemory
,甚至是FillChar
。它们不是宏,并且它们不执行任何Delphi认为是可以优化的未使用的赋值语句。
答案 1 :(得分:2)
Delphi默认执行代码优化,你可以在 Project>中禁用它。选项>编译器
Delphi帮助提供了一些使用何种优化的技巧:
$ O指令控制代码优化。在{$ O +}状态下,编译器执行许多代码优化,例如将变量放在CPU寄存器中,消除常见的子表达式,以及生成归纳变量。
它还声明“编译器不执行”不安全“优化”,但从某种意义上说它们不会改变执行路径,而不是从安全角度来看。
答案 2 :(得分:0)
我不相信编译器会像这样消除明显死的代码。我从来没有在代码上设置断点时遇到麻烦,这些代码可能已经被删除为冗余。
答案 3 :(得分:0)
对于某些情况,编译器可以检测代码是否无法访问并消除代码。
例如,编译器正确地消除了下面代码的“无法访问”部分 它不会为该行生成代码,所以:
刚刚在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 /条件句。