C語言中多維陣列是否慢於一維陣列?

時間 2021-05-29 23:23:17

1樓:土地測量員

對於在全域性或者棧上分配的多維陣列(也就是位址是連續的),都可以看成是一維陣列模擬出來的,要訪問某個元素肯定存在著計算偏移量的過程,不過是交給編譯器幫你來完成這個過程了(其實可以看成語法糖的樣子?)。所以它比起一維是要慢一點。

不過很多時候,某些東西從邏輯上來講就是多維的,你用一維的思路無法解決,所以開銷也避免不了。要麼你在直接分配乙個一維的陣列,然後自己每次轉換偏移量;要麼就分配多維陣列,偏移量讓編譯器算 ,後者肯定省事而且高效。

對於在堆上分配的動態多維陣列(不同緯度之間位址往往是不連續的),它不同維度的元素位址可能很分散。一來會導致多占用記憶體,因為多了若干層(和維度有關)間接的指標。二來訪問的時候也多了若干次(和維度有關)次解引用。

而且從快取區域性性來說,也增加了cache不命中的概率。所以還是分配乙個一維大陣列,然後手動計算偏移,或者把這個指標強制型別轉換,直接當成多維陣列操作,效率更高的可能性大一點。

2樓:zr scat

最終都轉換為位址訪問了,單次訪問甚至彙編都看不到區別。

遍歷或者其他操作要看訪問順序,根據區域性性原理,離得更近的訪問會有可能更快。

3樓:tearshark

a[1][2][3]與a[1 * Z + 2 * Y + 3]是一樣的。

你非要比較a[1][2][3]與a[1]的差異,那當然更慢咯。但a[1]也無法模擬多維陣列了啊。

C語言中字元陣列用 初始化?

Elias Wang 我們大致先把概念理清一下 字元陣列 初始化 在宣告變數的同時,為變數分配儲存空間,並初始化資料34 foo string literal 形式,初始化變數位址39 f o o 0 array 形式 賦值 變數已經被宣告,再對變數已有的儲存空間進行操作34 foo string ...

C 語言中指標陣列和陣列指標 函式指標 指向函式的指標等等該怎麼理解?

ga6840 direct declarator IDENTIFIER declarator direct declarator direct declarator assignment expr direct declarator declarator direct declarator poin...

C語言中有沒有3維陣列或者更高維的陣列?

沐雨澄風 c語言事存在三維陣列的 比如char s 3 4 1024 代表乙個三行四列的每乙個元素都是乙個字串的乙個陣列。更高維不知道hh 北極 首先 有三維或者更高維度的陣列,C語言規範中沒有指定最高可以到多少,翻了一遍C99沒有找到類似的規定。用GCC實驗了一下,GCC不檢測維數多少,而是限制陣...