为什么Delphi编译器不内联汇编函数?
有时候我会写很短的汇编函数
function SeniorBit(Value: LongWord): Integer;
asm
OR EAX,EAX
JZ @@Done
BSR EAX,EAX
INC EAX
@@Done:
end;
这似乎是内联的最佳候选人:
function SeniorBit(Value: LongWord): Integer; inline;
但Delphi编译器不允许它。 为什么?
更新:
感谢ldsandon,有一个有5.5年历史的关于QC的公开报告。 该报告包含一些提议(如扩展asm指令)以简化编译器的asm内联。 我宁愿在程序/功能级别上引入“裸体”指令,它告诉编译器它不必为程序创建栈帧,并且可以选择保留哪些寄存器(在eax,edx和ecx之间)。
如果使用BASM代码进行高效内联过程的一般任务很困难(并且可能不是必然的),那么一个好主意就是为最重要的情况启用内联(比如带有明确声明的注册表使用的裸函数)。
参见Quality Central报告#9283(并为此投票)。 基本上问题是编译器应该能够理解在内联代码之前要保留哪些寄存器以及之后要恢复的内容。 只要编译器处理寄存器,它很容易,如果没有使用控制,则不是。 你的例子非常简单,但编译器必须能够处理更复杂的情况。 该报告处于开放状态,希望新的编译器也能够内联BASM代码。
您不能内联手工制作汇编代码。
很难让这些汇编程序内联; 正常内联各种对寄存器使用的影响,局部变量等是编译器无法使用内联汇编的地方。
链接地址: http://www.djcxy.com/p/89885.html上一篇: Why Delphi compiler does not inline assembly functions?