簡體   English   中英

C:結構或數組的速度更快?

[英]What is faster in C: structs or arrays?

我想實現(代表抽象的)二維4x4矩陣。 我為矩陣乘法等編寫的所有代碼都將完全“展開” - 也就是說,我不會使用循環來訪問和寫入矩陣中的數據條目。

我的問題是:在C中,使用結構本身會更快:

typedef struct {
    double e0, e1, e2, e3, e4, ..., e15
} My4x4Matrix;

或者這會更快:

typedef double My4x4Matrix[16];

鑒於我將單獨訪問每個矩陣元素:

My4x4Matrix a,b,c;
// (Some initialization of a and b.)
...
c.e0=a.e0+b.e0;
c.e1=a.e1+b.e1;
...

要么

My4x4Matrix a,b,c;
// (Some initialization of a and b.)
...
c[0]=a[0]+b[0];
c[1]=a[1]+b[1];
...

或者它們的速度完全相同?

任何體面的編譯器都會生成完全相同的代碼,逐字節。 但是,使用數組可以讓您獲得更大的靈活性; 訪問矩陣元素時,您可以選擇是要訪問固定位置還是使用變量尋址位置。

我也高度質疑你選擇“放松”(展開?)所有操作。 任何好的編譯器都可以為您完全展開具有恆定迭代次數的循環,甚至可以生成SIMD代碼和/或最佳地調度指令的順序。 你會很難用手做得更好,而你最終會得到令人難以理解的代碼。 您提出這個問題的事實告訴我,您可能沒有足夠的經驗來做得比一個天真的優化編譯器更好。

結構元素(字段)只能通過在程序源中明確指定的名稱來訪問,這意味着每次訪問字段時,必須在編譯時選擇實際字段並進行硬編碼。 如果你想用數組實現相同的東西,那就意味着你將使用顯式的常量編譯時數組索引(如你的例子中所示)。 在這種情況下,兩者的性能將完全相同,生成的代碼將完全相同(不考慮“惡意”編譯器)。

但是,請注意,數組為您提供了額外的自由度:如有必要,您可以通過運行時索引選擇數組元素。 這是結構不可能實現的。 只有你知道這對你是否重要。

另一方面,請注意C中的數組不可復制,這意味着您將被迫使用memcpy復制基於陣列的My4x4Matrix 使用基於結構的版本,正常的語言級復制將起作用。 對於數組,可以通過將實際數組包裝在結構中來解決此問題。

我想兩者都是一樣的速度。 結構和數組之間的區別只是它的含義(用人的話來說。)兩者都將被編譯為內存地址。

我想說最好的方法是創建一個測試來自己嘗試。 結果可能因系統環境和編譯器而異。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM