Delphi的编译器优化有什么玄机? ( 积分: 100 )

  • 主题发起人 主题发起人 dablyo
  • 开始时间 开始时间
D

dablyo

Unregistered / Unconfirmed
GUEST, unregistred user!
有一个两层的循环嵌套
var
i,j : integer;
begin
....
for i:=0 to aaa-1 do
for j:=0 to bbb-1 do
...........

发现打开优化后,进入第二层循环,就是j所在的那层,j值非常古怪,直接跳到了bbb
我在下面省略的代码中用j作为下标来操作数组,明明已经越界了,但是调试器不报越界异常。关掉优化后正常。上面我的代码写法不规范?还是什么其他原因?
 
有一个两层的循环嵌套
var
i,j : integer;
begin
....
for i:=0 to aaa-1 do
for j:=0 to bbb-1 do
...........

发现打开优化后,进入第二层循环,就是j所在的那层,j值非常古怪,直接跳到了bbb
我在下面省略的代码中用j作为下标来操作数组,明明已经越界了,但是调试器不报越界异常。关掉优化后正常。上面我的代码写法不规范?还是什么其他原因?
 
理论上讲,对于循环变量正序还是倒序不影响结果的时候,DELPHI一般倾向于倒序,也就是倾向于for j:= bbb-1 downto 0 do这种形式.
你最好通过察看ASM来判定。
 
代码帖全看看,说不定是其他方面的影响,不过zjan521的答案上事实上的标准了[:D]
 
是的,因为用倒序可以利用到 LOOPZ 这个汇编指令,也就是可以提高效率。因此,如果你在循环内部没有使用循环变量,那么 Delphi 将倾向于使用倒序以提高效率。
当然,实际上有没有被优化为倒叙,应该以你在 CPU 窗口中看到的汇编代码为准。
 
后退
顶部