有时我会编写很短的汇编函数
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岁的开放式report on QC.该报告包含一些提议(如扩展asm指令)以简化编译器的asm内联.我更倾向于在过程/函数级别上引入“裸”指令,该指令向编译器说它不必为过程创建堆栈帧,并且可选地应保留哪些寄存器(在eax,edx和ecx中).
如果使用BASM代码进行高效内联过程的一般任务很困难(并且可能是不必要的),那么一个好主意是为最重要的案例启用内联(如明确声明的寄存器使用的裸函数).