簡體   English   中英

C ++中的內存分配區域(堆棧與堆與靜態)

[英]Memory allocation areas in C++ (Stack vs heap vs Static)

我知道C ++中有三個而不是兩個內存區域:堆棧,堆和靜態分配功能的區域。 我有兩個問題

  1. 為什么堆比堆棧慢得多? 當然它應該只是一個額外的間接水平?

  2. 為靜態“特性”(變量,函數,類)分配的內存區域是否提供比堆更快的性能?

首先是幾個旁注。 正確的術語是自動的而不是堆棧,動態而不是堆。 另一個是使用C ++ 11,現在有四種而不是三種類型的內存。 C ++ 11為混合添加了線程本地內存。

自動內存很快,因為它是在大多數機器上使用調用堆棧實現的。 所需要的是調整堆棧指針正確的數量和瞧! 內存已分配。 動態內存需要更多的工作。 必要的內存可能沒有附加到進程,並且要實現這一點需要通過操作系統。 即使內存可用,動態內存管理工具仍然必須找到它並將其標記為正在使用中。

靜態存儲器被“分配”為編譯和鏈接過程的一部分。 在某個源文件中定義靜態變量時,編譯的代碼包含鏈接器為該變量保留空間的特殊指令。 編譯器還將您的C / C ++代碼轉換為機器代碼。 鏈接器組合了所有這些不同的數據塊和代碼,並解析地址以形成可執行的二進制映像。 運行程序時,該二進制映像將加載到(虛擬)內存中。 程序開始執行后,該靜態變量的內存就會存在。

就性能而言,最好不要過早擔心性能問題。 雖然靜態內存很快,但存在許多缺點。 你要做的最后一件事是讓你的所有數據都是靜態的。

1)為什么堆比堆棧慢得多? 當然它應該只是一個額外的間接水平?

因為堆棧分配存儲器裝置通過增加1 stackpointer SP N其中N是字節數。 以這種方式改變sp足夠快。 使用堆,您可以執行許多操作,例如,查找空閑插槽或請求內存操作系統是昂貴的操作。

1.或減少,取決於堆棧增長的方式!

2)為靜態“特性”(變量,函數,類)分配的內存區域是否提供比堆更快的性能?

如果你的意思是static變量,那么是的,它們比堆快,因為它們是靜態分配的,它們一直存在到程序結束。 但是,沒有static類這樣的東西,並且在這種情況下無法比較為函數分配的內存(這個問題對我來說沒有任何意義)。

盡管“堆較慢”語句過於寬泛而無意義,但與堆分配相關的某些方面肯定比堆慢。 與堆棧不同,堆棧由於無法從堆棧中間移除而無法分段,因此堆會受到碎片的影響。 您的程序可以按任意順序取消分配對象,在堆中創建“漏洞”。 當您請求更多內存時,分配器必須搜索合適的“漏洞”以滿足您的請求。

此外,基於堆棧的操作由計算機硬件高度優化。 最后,在自動存儲中分配的對象(“堆棧”的官方名稱)由於與程序訪問的其他本地接近而具有更高的緩存概率。

static存儲而言,它僅適用於數據成員:靜態函數和靜態成員函數只是重用關鍵字而不重用其含義。 靜態存儲中的對象只分配一次,因此沒有碎片原因。

分配完成后,三種存儲(靜態,動態和自動)中對象的訪問速度幾乎相同。

在比較堆棧,堆或靜態分配區域的速度時,有兩種不同的速度可供比較。

首先,有訪問速度 雖然本地(堆棧分配)變量可能略有優勢,但這對於編譯器在CPU寄存器中緩存更容易,因此這三個區域中的每一個都具有可比性。 否則,它基本上只是內存訪問。

其次,有分配速度 這是產生巨大差異的地方。
靜態分配的對象在程序啟動時(或者當它們駐留在動態加載的庫中時,庫加載時)保留其內存,因此就程序而言,它們的分配時間短得多。
堆棧分配的對象分配起來也很便宜,因為它們采用編譯器可以輕松考慮的可預測分配模式(最后分配= =首先解除分配)。 例如,如果一個應用程序有多個線程,它也將有多個堆棧(每個堆棧為一個線程保留),因此線程不必相互競爭訪問堆棧內存。
堆分配的對象是困難的,因為堆用於不適合早期組的所有內容。 此外,整個應用程序通常只有一個堆,因此需要線程同步來從堆中分配內存。 並且,由於分配/解除分配模式相當隨機,因此必須采取措施以確保不會因堆的碎片而導致堆內存過多丟失。 這需要花費一些時間來進行分配或解除分配。

1)這不是間接問題,而是記憶問題。 在堆棧上分配內存只是將堆棧指針向上移動。 雖然堆上的分配涉及尋找合適大小的內存,並考慮碎片。

2)靜態內存在主入口點之前被分配到程序中,因此沒有真正的運行時開銷。 訪問已分配內存的速度並不真正取決於內存的分配位置。

堆棧比堆快得多的一個原因是由於局部性原理。 存儲在堆棧中的數據位於連續的位置,這意味着如果引用一個變量,則其相鄰信息將自動帶到高速緩存。 存儲在堆上的數據(動態數組除外)沒有這個優勢。

暫無
暫無

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

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