2016-12-06 34 views
0

是否有可能編寫一個程序,該程序在執行時採用用戶輸入,標記爲n,然後執行源代碼定義的一組指令n次,一次迭代直接在另一個之後,而不必增加計數器變量,並在每次迭代後將其與用戶輸入進行比較?換句話說,你可以告訴CPU「這樣做n次」,而不需要CPU啓動一個自我更新的計數器,並且在每次迭代之後都會對n進行檢查嗎?迭代用戶輸入的次數沒有比較?

+0

是關於CPU指令級別(無論硬件)還是任何編程語言(不管高級別)的問題? – kostix

+0

我的意思是,如果你的意思是後者,答案本身可能是模糊的,因爲足夠高級的語言只會隱藏一些循環結構背後的事實。例如,你可以在樸素的Bourne shell中做到這一點:'read n;因爲我在\'seq 1 $ n \';做echo $ i;完成「 - 正如你所看到的,沒有計數器,只是循環,而且你仍然按照輸入的」n「次迭代。 – kostix

+0

如果您想知道任何現有的H/W arch是否有一些隱含地循環訪問代碼的CPU命令,則問題會變得更加有趣。關於我的頭頂,我記得x86的'LOOPNE' /'LOOPNZ',但是它們會在專用寄存器中減少值,該寄存器最初包含迭代次數。如果對你沒有問題 - 遞減的屬性*已經完成,那麼這就是答案;-)否則請縮小你的問題範圍。 – kostix

回答

0

的種類。你可以做的是採取指令列表執行,重複它們n(確保修正任何絕對跳轉),添加function prologue and epilogue,將結果保存到area of memory that is allowed to execute code並將該區域的起點作爲函數調用。

請注意,進行這種代碼生成對於像C這樣的語言來說確實很難正確執行。您可能必須降低代碼,並在代碼中編寫代碼(或者至少部分代碼),或者更高版本並使用像C#這樣的語言,允許您操作一些代碼表示,然後將其編譯爲機器代碼。

此外,這不太可能導致顯着的性能收益。實際上,它可能會降低性能,因爲您的代碼可能不再適合CPU的指令緩存。

編譯器有時會自動部分執行此優化。這叫做loop unrolling