2016-02-12 48 views

回答

6

沒有指定C++標準應該做什麼。但我會說任何體面的編譯器都會優化這些代碼,甚至不會留下nop指令。

2

現代編譯器爲了某種目的發出類似nop的指令 - 通常用於對齊(在許多架構中,如果目標與16字節對齊,分支會更快地執行)或等待某些操作完成(IARC上的IIRC你必須在使用某些操作碼的結果之前等待一定數量的週期,所以要麼你有其他的事情要做,要麼你必須發射nop s)。

現在,無論我們是在這種情況下還是最有可能沒有nop將被髮射。對於這樣的函數,您可以期待定期的堆棧框架設置,隨後清理未優化的版本,或者在優化過的版本中使用普通的ret(加上堆棧清理代碼,如果調用約定規定的話)。更好的是,如果編譯器足夠智能並且在編譯呼叫站點時已知函數的定義(所以,這是一個static函數,啓用了一個inline或啓用鏈接時間碼生成),則該呼叫可能是完全省略,並且可能在最終的可執行文件中沒有保留功能代碼的蹤跡。