2017-02-09 90 views
6

switch語句如何立即下降到內存中的正確位置?嵌套的if語句必須與每個語句執行比較,但是使用switch語句直接轉換爲正確的語句。這是如何實施的?Switch語句如何工作

+6

你的編譯器可能有一個標誌來顯示它生成的彙編代碼...... Spoiler:通常它與大量if-s相同 –

+1

你認爲它的作用是什麼?而'if'不?請提供一個參考標準支持你的斷言的地方。 – Olaf

+0

@DavidConnolly:你能接受答案嗎? – chqrlie

回答

15

switch語句編譯成機器碼有很多不同的方法。這裏有幾個:

  • 編譯器可產生一系列的測試,這是不那麼低效的,因爲只有大約日誌(N)測試是足夠派遣之間Ñ可能的值案例。

  • 編譯器可以生成一個數值表和跳轉地址表,這些數據表又將被通用查找代碼(線性或二分類,類似於bsearch())使用,最後跳轉到相應的位置。

  • 如果案例值足夠密集,編譯器可以生成一個跳轉地址和代碼表,檢查開關值是否在包含所有大小寫值的範圍內並直接跳轉到相應的地址。這可能是與您的描述最接近的實現:但通過switch語句直接轉到正確的案例

根據目標CPU,編譯器設置的特定能力,數量和案值的分佈,編譯器可以使用上述方法中的一種或另一種,或者是它們的組合,甚至一些其他方法。

編譯器設計人員花費大量精力試圖改進這些選擇的啓發式。查看程序集輸出或使用在線工具(如Godbolt's Compiler Explorer)查看各種代碼生成可能性。