我在這裏看到特定語言的答案,有關多於5種情況的交換機正在使用跳轉表進行優化,以保證在任何情況下都能保持連續的訪問時間。
對於C/C++來說是這樣嗎?
它特別適用於gcc嗎?對於視覺工作室?
如果沒有,會按發生頻率的順序排列病例嗎?許多情況下的開關優化保證了任何情況下的相同訪問時間? (C++)
回答
這是編譯器會爲你做的。在GCC的情況下,它將使用跳轉表。
- C和C++不保證switch語句的運行時間。
- 恐怕我不知道任何編譯器的實現細節。它可能取決於優化標誌。
- 排序情況下,不保證,以幫助,再次它不是由標準規定,並且您的實現可能會或可能不會:根據編譯器選項
- 做不同的事情
- 文件它做什麼
- 保證不改變它在未來版本中的作用
- 完全忽略源代碼中的案例順序,然後重新排序它們,但它喜歡。當然,假設這些情況是「獨立的」:沒有發生轉折;沒有變量聲明從一種情況開始並跨越另一種情況;沒有任何我忘記的東西。
C(並且通過擴展C++)僅接通整數類型,所以散列是沒有必要的。編譯器通常會使用適合您正在編譯的體系結構的習慣用法。這可以是索引尋址(如果使用小範圍),跳轉表或完全不同的東西。
散列並不是必須的,但偶爾也可以使用完美散列作爲跳轉表的索引來優化一堆整數情況 - 基本上是一組非連續的數字,將它們映射到連續空間的速度比您可以遍歷二叉決策樹的速度快。不管這是一種優化,任何編譯器編寫者都會感到困擾是另一回事...... – 2010-01-25 01:49:29
@Steve:我會爲你說的,但是我已經知道足夠的程序集甚至可以對其進行評論的架構天),跳躍表會一致地加快。即使是兩級跳轉表也可以管理大整數範圍內的稀疏目標。 – dmckee 2010-01-25 01:52:55
我能想象的一個例外是一組二進制標誌的完美散列。即如果所有「案例值」都是2的冪。 – MSalters 2010-01-25 12:34:13
哈希似乎並不像執行一個開關的有效方式,因爲你將不得不由於查找額外的高速緩存未命中。
- 1. 開關情況下的多種情況?
- 2. 開關的情況下,代碼優化
- 3. 開關情況下(C)
- 4. Rails的情況下,/開關
- 5. 開關的情況下
- 6. 開關,對於多種情況下的相同值
- 7. 如何優化Oracle情況下的代碼情況?
- 8. PHP的開關情況下問題
- 9. 的Java /重構開關的情況下
- 10. 枚舉參考開關的情況下
- 11. PHP開關情況超過1值的情況下
- 12. 在默認情況下優化CMake
- 13. 的bash腳本的情況下開關
- 14. JOptionPane的帶開關的情況下
- 15. 的Javascript開關的情況下
- 16. 開關的情況下縮進
- 17. 的情況下
- 18. 優化iOS應用某些情況下
- 19. Java開關(使用在另一種情況下計算的情況下的值)
- 20. 枚舉在開關的情況下
- 21. 開關的情況下避免循環
- 22. PHP開關的情況下地址
- 23. 避免開關的情況下-linq
- 24. 開關的情況下沒有在JavaScript
- 25. 加工開關的情況下
- 26. 使用內部開關的情況下
- 27. PHP:代碼段(開關的情況下)
- 28. JS:在開關的情況下
- 29. Gotophobia在開關的情況下
- 30. 開關elseif的切換情況下
似乎它會使C成爲「Go殺手」,如果他們可以優化switch語句,那麼... – 2010-01-25 01:53:10
如果6次散列速度更快,我會非常驚訝。也許是25.當然,一個散列表可能會減少訪問時間的變化,但它通過增加一個固定的開銷來實現。 – MSalters 2010-01-25 12:31:54
我相信你明白,只有當交換機分支實際上沒有太大的作用,並且如果PC實際上處於交換機的相當一部分時間,比如10%或更多,這一點才重要。否則,它基本上是量子噪聲。 – 2010-01-25 16:34:48