時々、次のような非常に短いアセンブリ関数を記述します
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 のおかげで、QC に関する 5.5 年前の公開レポートが存在します。レポートには、コンパイラの asm インライン化を簡素化するためのいくつかの提案 (asm ディレクティブの拡張など) が含まれています。プロシージャ/関数レベルで「naked」ディレクティブを導入することをお勧めします。これは、プロシージャのスタック フレームを作成する必要がなく、オプションでどのレジスタ (eax、edx、および ecx) を保持する必要があるかをコンパイラに伝えるものです。
BASM コードを使用した効率的なインライン プロシージャの一般的なタスクが難しい (そして不要な場合がある) 場合は、最も重要なケース (レジスタの使用が明示的に宣言されたネイキッド関数など) でインライン化を有効にすることをお勧めします。