2010-01-25 76 views
8

我在這裏看到特定語言的答案,有關多於5種情況的交換機正在使用跳轉表進行優化,以保證在任何情況下都能保持連續的訪問時間。
對於C/C++來說是這樣嗎?
它特別適用於gcc嗎?對於視覺工作室?
如果沒有,會按發生頻率的順序排列病例嗎?許多情況下的開關優化保證了任何情況下的相同訪問時間? (C++)

+0

似乎它會使C成爲「Go殺手」,如果他們可以優化switch語句,那麼... – 2010-01-25 01:53:10

+1

如果6次散列速度更快,我會非常驚訝。也許是25.當然,一個散列表可能會減少訪問時間的變化,但它通過增加一個固定的開銷來實現。 – MSalters 2010-01-25 12:31:54

+0

我相信你明白,只有當交換機分支實際上沒有太大的作用,並且如果PC實際上處於交換機的相當一部分時間,比如10%或更多,這一點才重要。否則,它基本上是量子噪聲。 – 2010-01-25 16:34:48

回答

11

標準並不保證switch語句將如何實現。我從來沒有見過一個編譯器生成一個哈希表,但有不少會生成一個跳轉表。除非我的記憶力比平時更差,VS和gcc都可以在情況足夠密集的情況下產生跳轉表(對於「充分」的不同值)。不幸的是,當根據出現的頻率進行排序會有所幫助時,幾乎不可能說出(或者甚至不知道) - 它不僅在編譯器之間不同,甚至在同一編譯器的不同版本之間也不同。

+0

對不起,我的意思是跳轉表。 – Petruza 2010-01-25 15:04:44

+0

@Pretruza:你可以修復你的原始文章 – peterchen 2010-01-26 08:37:59

0

這是編譯器會爲你做的。在GCC的情況下,它將使用跳轉表。

2
  • C和C++不保證switch語句的運行時間。
  • 恐怕我不知道任何編譯器的實現細節。它可能取決於優化標誌。
  • 排序情況下,不保證,以幫助,再次它不是由標準規定,並且您的實現可能會或可能不會:根據編譯器選項
    • 做不同的事情
    • 文件它做什麼
    • 保證不改變它在未來版本中的作用
    • 完全忽略源代碼中的案例順序,然後重新排序它們,但它喜歡。當然,假設這些情況是「獨立的」:沒有發生轉折;沒有變量聲明從一種情況開始並跨越另一種情況;沒有任何我忘記的東西。
1

C(並且通過擴展C++)僅接通整數類型,所以散列是沒有必要的。編譯器通常會使用適合您正在編譯的體系結構的習慣用法。這可以是索引尋址(如果使用小範圍),跳轉表或完全不同的東西。

+2

散列並不是必須的,但偶爾也可以使用完美散列作爲跳轉表的索引來優化一堆整數情況 - 基本上是一組非連續的數字,將它們映射到連續空間的速度比您可以遍歷二叉決策樹的速度快。不管這是一種優化,任何編譯器編寫者都會感到困擾是另一回事...... – 2010-01-25 01:49:29

+0

@Steve:我會爲你說的,但是我已經知道足夠的程序集甚至可以對其進行評論的架構天),跳躍表會一致地加快。即使是兩級跳轉表也可以管理大整數範圍內的稀疏目標。 – dmckee 2010-01-25 01:52:55

+0

我能想象的一個例外是一組二進制標誌的完美散列。即如果所有「案例值」都是2的冪。 – MSalters 2010-01-25 12:34:13

0

哈希似乎並不像執行一個開關的有效方式,因爲你將不得不由於查找額外的高速緩存未命中。