function Add5(X: Integer): Integer;
begin
Result := X; // 1
Inc(Result, 5);
end;
这种情况语句1就会被优化掉,因为传入的参数 x 使用 eax 寄存器,而 Result 也使用 eax 寄存器,所以编译的时候这句就成了多余的。这种情况下ide中语句1之前不会出现蓝色的可设断点的蓝点儿(好比有些短的、没几个局部变量的函数begin/end语句没法设断点,因为不需要保存/恢复栈现场)。还有些情况比如某些for循环里可能产生的(delphi的for语法使编译器能够做一些特别的优化),有时候生成的代码会和原来的实现方法有差别,单步跟代码的时候可能会跑的和预想的不太一样,跟出来for循环变量的值也可能会与预期的不太一样。这种情况并不多见,如果跟反汇编的话就知道是怎么回事了。