有时我会写很短的汇编函数,比如
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 内联。我更愿意在过程/函数级别引入“naked”指令,它告诉编译器它不必为过程创建堆栈框架,并且可以选择保留哪些寄存器(在 eax、edx 和 ecx 中)。
如果使用 BASM 代码进行高效内联过程的一般任务很困难(并且可能是不必要的),那么一个好主意是为最重要的情况启用内联(例如具有显式声明寄存器使用的裸函数)。