我有一個2d數組。我需要儘可能快地執行一些操作(函數將被稱爲每秒十幾次,所以它會很高效)。執行直接指針操作還是更好?或者[
現在,讓我們說,我想元素A[i][j]
,有沒有簡單地使用A[i][j]
和*(A+(i*width+j))
(忽略了一個事實,我需要計算我*寬+ J,讓我們說我已經有這個值)之間的任何速度差?
我有一個2d數組。我需要儘可能快地執行一些操作(函數將被稱爲每秒十幾次,所以它會很高效)。執行直接指針操作還是更好?或者[
現在,讓我們說,我想元素A[i][j]
,有沒有簡單地使用A[i][j]
和*(A+(i*width+j))
(忽略了一個事實,我需要計算我*寬+ J,讓我們說我已經有這個值)之間的任何速度差?
隨着所有優化開啓,不應該有任何區別 - 不僅在時間上,而且在編譯器爲這兩個構造生成的代碼中也不會有區別。
與程序員的觀點最大的區別在於可讀性。第一個構造立即告訴讀者他正在處理一個二維數組,而第二個構造需要一些思考(這是一個行主命令還是一個列主命令?width
在哪裏計算?選擇的理由是什麼這種方式通過更明顯的二維數組語法?)。這就是爲什麼第一個構造在實際情景中更可取的原因。
作爲一名程序員,我真的對程序如何訪問內存有任何控制嗎?或者,我的代碼僅僅是一個建議? – Xyzk
@Xyzk除了無法區分差異的情況(即程序邏輯沒有改變時),您的代碼幾乎可以完全控制訪問內存中的數據。 – dasblinkenlight
根據編譯器的質量,我認爲[]符號可以導致更快的代碼。原因是當你使用指針時,編譯器不能確定指針別名沒有發生,這可能會阻止某些優化。
OTOH,如果使用[]符號,那麼這些問題不適用,編譯器在應用優化時可能會變得更積極。
爲什麼你不測試和發現? – chris
@chris,因爲我測試過的最後兩次我被設置正確的編譯器標誌的人知識較好,但仍被證明是錯誤的 – Xyzk
答案是肯定的。使用任何可以讓程序更清晰的意圖。 – keshlam