2009-12-26 48 views
0

什麼需要最多的CPU:C++中較少的CPU使用率:聲明爲unsigned int或不?

int foo = 3; 

,或者類型轉換爲unsigned int類型?

unsigned int foo = 3; 
+5

只需做一些gazillion quadrillion時間來分析;-) – 2009-12-26 23:19:48

+2

類型轉換是發生在演員身上的事情 - 有一個SO標籤,但可能不應該是 – 2009-12-26 23:27:43

+1

只有壞的。 – Joe 2009-12-26 23:29:01

回答

3

我的直接想法是:它不是將int轉換爲無符號整型。所以速度沒有區別。 here是關於快速類型的鏈接。然而,它更多的是應該優化而不是類型的算法和功能。

+0

你說的很容易理解,所以我把它當作我接受的答案。 – Midas 2009-12-26 23:34:26

+1

@Midas:如果你不能理解其他答案,也許你不應該關注像這樣的微型優化 – 2010-06-06 10:32:06

18

它們都由內存中的相同位表示。這只是一個如何解釋位的問題,這取決於你想要的值的範圍。所以,兩者都不是更密集的。

至於與數字打交道,以乘法的例子:我不是專家,但據wikipedia,在86還有無符號乘(mul)操作碼和符號乘法(imul),這將意味着他們可能採取相同的時間長度。

+0

很好解釋。感謝您的快速回復! – Midas 2009-12-26 23:23:48

5

CPU使用率沒有差異。

事實上,你幾乎可以保證這些聲明會編譯成相同的代碼。

唯一的區別是,編譯器會記住這個變量是signedunsigned,並決定如何實施操作諸如重載函數調用比較或決定。

1

在這個例子中,根本沒有成本差異。

10

這產生組件在MS VC 2005:

; 9 : int foo = 3; 

    mov DWORD PTR _foo$[ebp], 3 

; 10 : unsigned int bar = 3; 

    mov DWORD PTR _bar$[ebp], 3 

無差:)

0

沒有區別。你可以通過查看生成的彙編語言來判斷。即使存在差異,您應該意識到這是微觀優化,考慮這個問題的最佳時機是在宏觀優化完成之後,這是您的工作,而不是編譯器。

0

聲明一個普通的int而沒有指定符號性 - 原則上應該讓編譯器知道在大小和符號性方面可以自由選擇最自然的整數類型。但實際上,現代臺式機處理器沒有速度差異(儘管可能在某些嵌入式系統上)。

1

當你做分裂。 使用unsigned int快於int。 (當然當實際上並不需要減號時)

0

您通常不會在實踐中發現任何差異,所以在我看來最好的做法是根據它的值的特定於應用程序的語義來選擇類型應該表示:使用無符號類型來表示無符號數量;相同的簽名。儘管有人反對這一理念,但只要他們願意,他們更願意使用int,而unsigned int

至於實際性能,如果您仍然關心它,那當然取決於編譯器和硬件平臺。例如,想到的一件事是,C/C++所要求的有符號整數除法的語義(往零歸零)通常與硬件平臺實現的語義不同(向負無窮大轉變),這意味着對於簽名類型的部門可能需要更多的指示(調整結果)比無符號類型。還有其他一些小怪癖。但無論如何,在實踐中你都不會注意到它。

P.S.我不知道你爲什麼在你的問題中提到「類型轉換」,而接下來的代碼示例中沒有類型轉換。