有时我写非常短的装配功能,如

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报告。该报告containes一些建议(如延长ASM指令),简化编译器的内联汇编。我宁愿引进的过程/函数水平,这说来,它并没有创造的程序堆栈帧和可选什么寄存器(中EAX,EDX和ECX)编译器的“裸”指令应予以保留。

如果与BASM代码高效内联程序的总任务是困难的(并且可以是unnessessary)一个好主意,是使内联的最重要的情况下(如使用显式地声明寄存器使用裸功能)。

有帮助吗?

解决方案

请参阅质量报告中央#9283(投票支持它)。基本上,问题是编译器应该能够了解寄存器内联代码之前保存,哪些后恢复。只要编译器处理的注册很容易,当使用不是下控制它不是。 你举的例子是非常简单的,但是编译器必须能够处理更复杂的情况。该报告是打开状态,希望新的编译器能够内联BASM代码。

其他提示

可以不是内联的手工制作的汇编代码。

这将是很难让这些片汇编的内联;与正常内联各种效果上寄存器使用,局部变量等是有编译器不能与内联组件做。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top