有時我寫的很短的裝配功能,如爲什麼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歲開report on QC。該報告包含一些提議(如擴展asm指令)以簡化編譯器的asm內聯。我寧願在程序/功能級別上引入「裸體」指令,它告訴編譯器它不必爲程序創建棧幀,並且可以選擇保留哪些寄存器(在eax,edx和ecx之間)。
如果使用BASM代碼進行高效內聯過程的一般任務很困難(也可能沒有必要),一個好主意是爲最重要的情況啓用內聯(如裸函數與明確聲明的寄存器使用)。
在編譯時使用不同的調用約定時,應該在結果之後添加寄存器調用約定(例如...:Integer; register;)以確保該函數也可以工作。 – 2010-03-10 07:30:01
如果您想討論編譯器支持內聯彙編函數的未來可能性,那麼QC或消息板可能是最好的選擇。我試圖回答,目前確實不可能用asm塊嵌入函數,因爲它是實現的。你可能認爲這是一個好主意(嘿,我喜歡大會,並認爲它會很好)。但是SO是討論編譯器功能請求的地方嗎?我想你想得到關於你手邊的問題的答案:爲什麼我不能把這個內聯。 – 2010-03-10 10:19:34
@Ritsaert Hornstra:您爲什麼認爲SO不是討論編譯器功能請求的地方?這顯然是編程問題,必須在哪裏解答如何以最好的方式實現這個東西,以及[可能的修辭問題]爲什麼這個東西還沒有實現。 – kludg 2010-03-10 10:39:05