有时我会编写非常短的汇编函数,例如:
似乎最适合内联的候选项是:
但是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代码的总体任务很难(甚至可能不必要),一个好主意是为最重要的情况(如明确声明寄存器使用的裸函数)启用内联。