ptr = malloc(size);
或C++
ptr = new Klass();
將在堆上分配size個字節。它比在堆棧上效率低。
但分配後,當我們訪問它:
foo(*ptr);
或
(*ptr)++;
是否有相同的性能,堆棧,或者在數據仍然慢?
ptr = malloc(size);
或C++
ptr = new Klass();
將在堆上分配size個字節。它比在堆棧上效率低。
但分配後,當我們訪問它:
foo(*ptr);
或
(*ptr)++;
是否有相同的性能,堆棧,或者在數據仍然慢?
這真的取決於你在比較什麼和如何。
如果你的意思是慢
ptr = malloc(10 * sizeof(int));
:
int arr[10]
ptr = arr;
,然後使用ptr
來訪問它指向的整數?
然後沒有。
如果你指的是在第二種情況下使用arr[0]
代替*ptr
,可能,因爲編譯器具有讀取ptr
值找到實際的變量的地址。然而,在很多情況下,它會「知道」ptr
內的值,所以不需要自己讀取指針。
如果我們比較foo(ptr)
和foo(arr)
它根本沒有任何區別。
[在堆上實際分配時可能會有一些處罰,因爲第一次使用時內存必須「提交」。但是對於每個4KB來說最多隻有一次,而且在大多數情況下我們可能會忽略]。
我的意思是,例如:'struct bar bar'並且使用'foo(bar)'和'struct Bar * bar = malloc(sizeof(struct Bar))'並且使用'foo(* bar)'訪問' – texasbruce
調用'malloc',沒有。 [當然,隨後調用'free'!] –
確定地回答這個問題的唯一方法是編碼兩個版本並在多種情況下(不同的分配大小,不同的優化設置等)測量它們的性能。這種事情在很大程度上取決於不同因素的,如優化設置,操作系統如何管理內存,正在分配的塊的大小,訪問的位置等。從不一味地認爲一種方法是在任何情況下都比另一個更「高效」。
即使如此,結果將只適用於您的特定系統。
堆棧比堆更快,因爲它涉及到移動堆棧指針這麼簡單。堆棧的大小是固定的。與Heap相比,用戶需要手動分配和取消分配內存。
您描述了分配和釋放過程,但是這個問題是關於已經分配的內存的訪問。 – delnan
比較在O(n^2)時間和O(nlogn)時間運行的算法等時,效率考慮很重要。
比較存儲器存儲訪問,這兩種算法都是O(n)或O(k),通常是可以測量任何差異的NOT。
但是,如果您正在爲經常調用的內核編寫一些代碼,那麼可能會發現一個小的差異。
在這個問題的上下文中,真正的答案是它確實無關緊要,使用任何存儲器都可以使您的程序易於閱讀和維護。因爲從長遠來看,支付人類閱讀你的代碼的代價遠遠超過了運行一個或多或少指令的CPU的成本。
我不認爲它在實踐中顯着不同。 –