簡體   English   中英

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

[英]Does allocation on the heap affect the access performance?

眾所周知:

ptr = malloc(size);

或在C ++中

ptr = new Klass();

將在堆上分配大小字節。 它比堆棧上的效率低。

但是在分配之后,當我們訪問它時:

foo(*ptr);

要么

(*ptr)++;

它與堆棧上的數據具有相同的性能還是更慢?

明確回答這個問題的唯一方法是對兩個版本進行編碼,並在多種情況下(不同的分配大小,不同的優化設置等)衡量它們的性能。 這種事情在很大程度上取決於許多不同的因素,例如優化設置,操作系統如何管理內存,分配的塊的大小,訪問的位置等。 永遠不要盲目地認為一種方法更“有效”。在所有情況下都比另一個要好。

即使這樣,結果也僅適用於您的特定系統。

這實際上取決於您正在比較什么以及如何進行比較。

如果你的意思是

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

慢於:

int arr[10]
ptr = arr; 

然后使用ptr訪問它指向的整數?

那就不要。

如果要在第二種情況下使用arr[0]而不是*ptr ,則可能是因為編譯器必須讀取ptr的值以查找實際變量的地址。 但是,在許多情況下,它將“知道” ptr的值,因此不需要自己讀取指針。

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

[在堆上實際分配可能會有一些損失,因為在第一次使用時必須“承諾”內存。 但這每4KB最多只能有一次,在大多數情況下,我們可能會忽略它。

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

比較存儲器存儲訪問,兩種算法為O(n)或O(k)和通常是不可能測量的任何差異。

但是,如果您正在為頻繁調用的內核編寫一些代碼,則可能會有很小的差異。

在這個問題的上下文中,真正的答案是,這並不重要,無論使用哪種存儲方式,都使您的程序易於閱讀和維護。 因為,從長遠來看,付出人工來閱讀代碼的代價要比運行cpu來獲取更多(或更少)指令的成本高。

堆棧比堆快得多,因為它涉及到移動堆棧指針一樣簡單。 堆棧大小固定。 與堆相比,用戶需要手動分配和取消分配內存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM