什麼需要最多的CPU:C++中較少的CPU使用率:聲明爲unsigned int或不?
int foo = 3;
,或者類型轉換爲unsigned int類型?
unsigned int foo = 3;
什麼需要最多的CPU:C++中較少的CPU使用率:聲明爲unsigned int或不?
int foo = 3;
,或者類型轉換爲unsigned int類型?
unsigned int foo = 3;
CPU使用率沒有差異。
事實上,你幾乎可以保證這些聲明會編譯成相同的代碼。
唯一的區別是,編譯器會記住這個變量是signed
或unsigned
,並決定如何實施操作諸如重載函數調用比較或決定。
在這個例子中,根本沒有成本差異。
這產生組件在MS VC 2005:
; 9 : int foo = 3;
mov DWORD PTR _foo$[ebp], 3
; 10 : unsigned int bar = 3;
mov DWORD PTR _bar$[ebp], 3
無差:)
沒有區別。你可以通過查看生成的彙編語言來判斷。即使存在差異,您應該意識到這是微觀優化,考慮這個問題的最佳時機是在宏觀優化完成之後,這是您的工作,而不是編譯器。
聲明一個普通的int
而沒有指定符號性 - 原則上應該讓編譯器知道在大小和符號性方面可以自由選擇最自然的整數類型。但實際上,現代臺式機處理器沒有速度差異(儘管可能在某些嵌入式系統上)。
當你做分裂。 使用unsigned int
快於int
。 (當然當實際上並不需要減號時)
您通常不會在實踐中發現任何差異,所以在我看來最好的做法是根據它的值的特定於應用程序的語義來選擇類型應該表示:使用無符號類型來表示無符號數量;相同的簽名。儘管有人反對這一理念,但只要他們願意,他們更願意使用int
,而unsigned int
。
至於實際性能,如果您仍然關心它,那當然取決於編譯器和硬件平臺。例如,想到的一件事是,C/C++所要求的有符號整數除法的語義(往零歸零)通常與硬件平臺實現的語義不同(向負無窮大轉變),這意味着對於簽名類型的部門可能需要更多的指示(調整結果)比無符號類型。還有其他一些小怪癖。但無論如何,在實踐中你都不會注意到它。
P.S.我不知道你爲什麼在你的問題中提到「類型轉換」,而接下來的代碼示例中沒有類型轉換。
只需做一些gazillion quadrillion時間來分析;-) – 2009-12-26 23:19:48
類型轉換是發生在演員身上的事情 - 有一個SO標籤,但可能不應該是 – 2009-12-26 23:27:43
只有壞的。 – Joe 2009-12-26 23:29:01