2014-02-24 23 views
2

我有一個通用的解決問題的用C語言編寫的是採用值數組和解決它就地。該問題作爲一個固定大小的數組,然後傳遞給一個求解函數。切換到使用指針而不是固定大小的數組時,遇到了一個奇怪的性能問題。C中的數組/指針參數轉換

設置代碼如下:

int main() { 
    int board[256]; 
    ... 
    int *board2 = malloc(sizeof(int) * 256); 
    memcpy(board2, board, 256); 
    int result = solve_board(___); 
} 

我已經測試了以下聲明和電話(沒有其他有關程序的修改):

// type 1 - fixed-size array 
int solve_board(int board[256]); 
solve_board(board); // 1.167 seconds 
solve_board(board2); // 3.760 seconds 
// type 2 - pointer 
int solve_board(int *board); 
solve_board(board); // 1.173 seconds 
solve_board(board2); // 3.529 seconds 

solve_board是部分遞歸的,因此呼叫在執行期間犯了很多次。結果對所有情況都是準確的。

任何人都可以解釋爲什麼使用動態數組需要這麼比沿着固定大小的數組經過更長的時間?

回答

7

這是很可能,這就是問題所在:

memcpy(board2, board, 256); 

此副本256 字節,不整數,從一個陣列到另一個。您可能的意思是:

memcpy(board2, board, 256 * sizeof(int)); 

因此,您的兩個測試用例未在相同的數據上運行。剩餘的(256 *(的sizeof(INT) - 1))的board2字節是未初始化的並且有垃圾(=未定義)值。