2016-11-12 16 views
1

壓倒性的建議似乎是在C中更喜歡int s,除非空間很重要(http://c-faq.com/decl/inttypes.html)。傾向於儘可能短的類型

傾向於使用最短的類型可能會更有意義嗎?

較短的類型在大集合中具有明顯的優勢 - 集合在縮短類型時佔用的空間較小。

在數值函數,int s與它應該是CPU與他們的工作速度更快的優勢,但不是那麼優化的工作在int交換,當我在堆棧上聲明short然後我繼續計算?我試過編譯幾個數值函數,一次用短褲,然後用整數,然後在-O3處得到相同的輸出組件(短褲是2字節,整數是我的架構上的4),所以它看起來似乎整體建議不再有效,特別是考慮到節省空間的潛力,考慮到CPU /內存性能差距擴大,這應該比以往更重要。 (我認爲在數字和大型集合中使用數據結構是相當普遍的)。

有沒有什麼原因讓我不應該傾向於默認最短的類型?

+0

該程序集不能完全相同:如果沒有別的,則需要將數據轉換爲另一種類型。 –

+0

@ScottHunter我試過類似'$ t compute _ $ {t}($ t a,$ t b) { $ t sum = 0; ($ t i; i <30; i ++){ sum + = a + 2 * b; } return sum; } '和它得到了降低到'LEA爲0x1(%RSI),%eax中 IMUL%EAX,EDI% IMUL $ 0X1E,EDI%,%EAX retq '在這兩種情況下。我想如果一切都發生在寄存器中,那麼不需要轉換。 – PSkocik

回答

3

您應該堅持標準int,因爲它是機器最容易使用的尺寸。其他尺寸需要額外的說明或特殊說明,並且這些說明需要更多空間。

你說你得到和-O3完全相同的輸出組件,但我會仔細檢查,例如我會在彙編語言輸出文件之間運行一個diff

如果你有一個大數的整數值,使得數據空間差異超過程序大小差異,那麼考慮較短的值。 即便如此,只是擔心如果存儲大小實際上是一個問題。 通常情況下不是。

+0

我試過的第一個測試被編譯成純粹發生在寄存器中,所以確實沒有區別。當我試圖在數組上應用這個函數時,「short」版本與預期略有不同。我仍然想知道,由於添加指令而增加的CPU時間將如何被不同工作集大小的內存訪問減少所抵消。新硬件的相對內存訪問時間的增加很可能導致舊建議過時,但我想,要知道,這需要一些廣泛的基準。 – PSkocik

+0

@PSkocik:我不知道你是否正在假設,正如很多其他程序員所假設的那樣,你正在關注的代碼實際上佔了包含它的應用程序總執行時間的很大一部分。我相信你知道[*路燈效果*](https://en.wikipedia.org/wiki/Streetlight_effect)。通常,當我進行性能調整時,可能會有幾個我可能提前無法猜測的大型加速,其次是一些像您的那樣嚴格的代碼,最初佔用了大約1%的時間,只有在其他代碼之後才值得關注。 –

0

我同意Mike關於堅持原生尺寸的意見。我從硬件的角度理解你的問題(它應該是在總線上啓用哪些字節的問題)。

如果您有32位總線但決定使用16位或8位整數,則可能會在處理器上實施打包/解包成本。我一直使用的一些較舊的RISC處理器一次只想獲取32位。所以如果你想更新一個字節,它必須首先讀取整個32位,然後它需要掩蓋感興趣的字節。通過一切手段,使用您的目標編譯器和優化設置進行測試。如果您看到32位與16位或8位整數的差異,請查看您的編譯器是否可以爲您提供一個interlist,並讓您瞭解編譯器如何處理短整型。