2013-07-24 18 views
0

-Wconversion警告打開桌面上使用GCC,它變得明顯,short小號獲得在數學運算提升到int s的數字文字:Clang在與ARM目標上的數字文字結合使用時將短褲整數提升爲整數嗎?

unsigned short i = 10; // Obviously truncates to short immediately 
unsigned short j = 30; // Same here 

i = j + 2; // Warnings imply j gets promoted to int here, demands cast 

在ARM的目標,其中的規則甩一下的是, 「短褲總是比較快」,在幾乎所有的數學運算(特別是包括文字)期間,它們都被提升爲int s的操作嗎?

如果是這樣,是否有任何理由使用short s,除非他們讓編譯器幫助您檢查邊界是否合理?我沒有處理大量的短褲,所以存儲空間似乎不是問題(或者是?)。

注意:這是音頻處理,所以我不是爲了它而優化,而且需要考慮這個問題。

+1

「+」運算符將操作數提升爲int(例如,如果它的'char'或leas,則sizeof(int)')。 –

+2

你從哪裏看到關於ARM的「短褲總是更快」?這顯然是胡說八道,因爲每次從32位寄存器中移出時,它們必須被截斷爲16位。 –

回答

4

在ARM的目標上,拋出的規則是「短褲總是比較快」,在幾乎所有的數學運算(特別是包括文字)期間,它們都會被提升爲整數操作?

由於整數提升規則,對於大多數運算符,short操作數被提升爲int

例如

i = j + 2; // j is promoted to int because of integer promotion 

而且

i = i + j; // i and j are promoted to int in the + expression 

在ARM的目標,其中的規則甩一下的是, 「短褲總是更快」

在ARM, short16位,但ARM字大小是32位,所以這個說法是錯誤的。 shortchar需要簽名擴展或零擴展,並且速度較慢。 short可用於節省內存,但對於性能intlong更快。

2

算術運算符不接受小於int的類型作爲參數。

2

形式上,該語言要求在大多數算術運算之前提升比int窄的類型(或者到intunsigned int)。這意味着在您的示例中,j被升級爲int,該添加在int中執行,結果通過賦值轉換回short

但是,如果編譯器不會改變程序的可觀察行爲,編譯器可以自由地忽略這些轉換。由於這種情況下的結果被轉換回short,這裏適用 - 編譯器可以發出一條直接執行short大小的加法的指令,這是合法的。如果在目標平臺上執行速度更快,則可以預期clang會這樣做。