2013-08-22 66 views
1

已知:堆上的分配是否會影響訪問性能?

ptr = malloc(size); 

或C++

ptr = new Klass(); 

將在堆上分配size個字節。它比在堆棧上效率低。

但分配後,當我們訪問它:

foo(*ptr); 

(*ptr)++; 

是否有相同的性能,堆棧,或者在數據仍然慢?

+0

我不認爲它在實踐中顯着不同。 –

回答

1

這真的取決於你在比較什麼和如何。

如果你的意思是慢

ptr = malloc(10 * sizeof(int)); 

int arr[10] 
ptr = arr; 

,然後使用ptr來訪問它指向的整數?

然後沒有。

如果你指的是在第二種情況下使用arr[0]代替*ptr,可能,因爲編譯器具有讀取ptr值找到實際的變量的地址。然而,在很多情況下,它會「知道」ptr內的值,所以不需要自己讀取指針。

如果我們比較foo(ptr)foo(arr)它根本沒有任何區別。

[在堆上實際分配時可能會有一些處罰,因爲第一次使用時內存必須「提交」。但是對於每個4KB來說最多隻有一次,而且在大多數情況下我們可能會忽略]。

+0

我的意思是,例如:'struct bar bar'並且使用'foo(bar)'和'struct Bar * bar = malloc(sizeof(struct Bar))'並且使用'foo(* bar)'訪問' – texasbruce

+0

調用'malloc',沒有。 [當然,隨後調用'free'!] –

2

確定地回答這個問題的唯一方法是編碼兩個版本並在多種情況下(不同的分配大小,不同的優化設置等)測量它們的性能。這種事情在很大程度上取決於不同因素的,如優化設置,操作系統如何管理內存,正在分配的塊的大小,訪問的位置等。從不一味地認爲一種方法是在任何情況下都比另一個更「高效」。

即使如此,結果將只適用於您的特定系統。

-3

堆棧比堆更快,因爲它涉及到移動堆棧指針這麼簡單。堆棧的大小是固定的。與Heap相比,用戶需要手動分配和取消分配內存。

+3

您描述了分配和釋放過程,但是這個問題是關於已經分配的內存的訪問。 – delnan

0

比較在O(n^2)時間和O(nlogn)時間運行的算法等時,效率考慮很重要。

比較存儲器存儲訪問,這兩種算法都是O(n)或O(k),通常是可以測量任何差異的NOT

但是,如果您正在爲經常調用的內核編寫一些代碼,那麼可能會發現一個小的差異。

在這個問題的上下文中,真正的答案是它確實無關緊要,使用任何存儲器都可以使您的程序易於閱讀和維護。因爲從長遠來看,支付人類閱讀你的代碼的代價遠遠超過了運行一個或多或少指令的CPU的成本。

相關問題