2009-07-23 116 views
1

我只是想知道在C結構(C結構定義)中包裝項目(int,float,union等)時要遵循的注意事項,以便編譯器進一步優化它。最佳C結構定義

我想知道是否有任何指導方針應該遵循例如以允許與單詞邊界對齊的順序將項目添加到結構。等等?

詳情將不勝感激。

問候, -J

問題也需要向交叉的優化策略編譯例如C結構。

回答

5

如果您可以在gcc下編譯您的代碼,您可以使用pahole來查找可以改進的結構,並自動重新打包它們。

這裏有一對夫婦約pahole的文章,可以幫助你:

+0

pahole似乎有趣的工具。但我不確定我是否使用gcc優化了我在linux上的結構定義,當我在Visual Studio環境中的Windows上編譯它時,我該如何重新考慮它。 (我不是windows的傢伙,所以它讓我花更多時間來理解這個方面: - /) – 2009-07-24 17:18:00

+0

結構填充和對齊要求往往與硬件平臺相關聯,所以GCC的輸出結構應該與VS的輸出結構相同。 – Hasturkun 2009-07-24 20:38:17

+0

哦!我認爲它的編譯器是特定的,因爲每個編譯器都有自己的安排數據結構的方式。 (儘管每個編譯器都試圖按照硬件來優化)。因此,如果最初編譯的代碼在給定的平臺上不是最優的,那麼意味着交叉編譯的代碼將是最優的。對 ? – 2009-07-24 23:48:59

6

如果您確實想要最小化空間,請將事情從最大對齊排列到最小。這應該保證你會得到最小的填充。

+0

一個好的優化編譯器應該可以爲你做到這一點,但我不知道會有多少人會。我會假設GCC這樣做,但我沒有測試它。 – 2009-07-23 17:27:09

+10

C不允許編譯器重新排列結構中的成員,所以如果你想要最小的空間和最高的效率,你必須自己做。 – nos 2009-07-23 17:31:40

+0

@chris,我希望它不會因爲那肯定會被二進制blob映射破壞! – 2009-07-23 17:33:45

0

什麼是你的程序的要求是什麼?你會有多少元素?什麼樣的結構?例如,如果你有幾個元素的結構體,並且你需要遍歷這些元素的數組以搜索某些東西,那麼最好不要使用數組的結構體,而是要做數組的結構體。這是因爲經常使用的成員將並排定位,所以緩存內存將正常工作。

如果您想利用SIMD(矢量)操作,您應該通過一些邊界對齊所有成員。

很難提供正確的建議,因爲我不知道您對數據有什麼期望。