1樓:小莋
學習電腦程式設計多年了,在程式設計方面也算有一番見解,希望這些經驗能對題主有所幫助。
實際上,當我們不考慮快取時,堆和堆疊的速度是絕對沒有差別的。當我們考慮快取時,因為堆疊是當前**段中最常被訪問的記憶體,它在快取上的概率幾乎是100%。換句話說,不會有快取遺漏(不要使用異常,因為我們討論的是一般情況)。
一般來說,快取遺漏會出現,雖然快取遺漏可以通過適當的編碼方法來減少,但是一般來說,無法與堆疊進行比較。這就是堆疊快速和堆緩慢的原因。如果您已經知道前面的語句,那麼您希望通過擴充套件堆疊來提高程式的效能,這基本上是無用的,因為快取是固定在指定的機器上的。
您提到的預設的1m堆疊應該引用呼叫堆疊。該堆疊用於儲存由函式呼叫傳遞的引數(不是所有引數都通過堆疊傳遞)、堆疊指標、返回地址、暫存器備份和每個層函式的區域性變數。大多數情況都是足夠的,如果你用光了它們,就會出現非法訪問等錯誤。
您可能會使用一個1米的例子:一些被呼叫的函式應用於一個大型的區域性變數,例如堆疊上的一個大陣列。然後是遞迴呼叫,在遞迴層之後很容易使用1 m。
所以我不想遞迴地使用這個。
現在堆疊通常預設為8m,對吧?事實上,如果你不濫用遞迴,或者alloca / vla,大多數時候,就足夠了。即使它不超過核心限制,通常也不適合驅動大型的,或者它會影響併發程序的數量。
並且過程啟動時間也應該稍微減少。當然,如果是專用的伺服器系統,問題就不嚴重了。
2樓:寧ning子
也許你會覺得學電腦多年,依然感覺電腦這趟水很深,你會遇到很多問題,這就需要你自己去克服了,慢慢來,相信你會成為電腦高手的。
我覺得x86上面的堆疊記憶體,主棧是由ss和sp訪問,在32位保護模式下,ss登記是一段選擇器選擇器是一個數字,通過idt(區域性描述符表)或gdt(全域性描述符表)選擇一個段描述符包含細分市場的規模和範圍資訊描述。
這就是我所知道的和cpu有關的,段的大小上限為4gb(即使你的電腦沒有4g的記憶體)。之所以說棧主要是用ss和sp訪問是因為其他定址方式訪問棧段是完全可以的,不過push和pull指令壓棧和出棧看起來要簡單一點,至於有沒有速度優勢?
我猜應該沒有吧,否則處理器的構架設計師會被吐槽的。至於為什麼作業系統會限制棧段的大小(一般情況下,x86的作業系統控制段大小應該位是通過描述符控制的),因為程式使用棧的空間都不會使用太大的棧空間,因為std呼叫協議是這樣的:(我瞎編的,不要當真) 函式呼叫時,右邊的引數先入棧。
於是每次呼叫其他函式時,先push各個引數,然後call,call指令會只壓入eip或者一起壓入cs:eip,取決於短跳轉還是長跳轉。
然後進入函式之後,函式開始宣告區域性變數,這些變數就被壓棧,緊跟在eip之後,你都用不了多大的棧,多多的分配給你不是浪費嗎。並沒有資料顯示棧會比堆快,除了申請的時候慢了一點之外。當然可能會和快取記憶體命中率有關。
堆疊和堆都是記憶體的組成部分。
沒有更快的論證,有些書說堆疊比堆效率高。這是由於訪問演算法和堆疊訪問效率的差異。不同之處在於堆疊是由編譯器分配的。
例如,如果您定義了一個區域性變數,它會自動分配給堆疊,而這個堆是程式設計師分配的。在c語言中,外顯記憶是通過malloc分配儲存資料。
python中棧和堆的各自的作用和區別分別是什麼
python queue模組有三種佇列 1 python queue模組的fifo佇列先進先出。2 lifo類似於堆。即先進後出。3 還有一種是優先順序佇列級別越低越先出來。針對這三種佇列分別有三個建構函式 1 class queue.queue maxsize fifo 2 class queue...
設計演算法,入棧和出棧的操作。具體實現要求 1寫出棧的入棧和出棧演算法。2寫程式,將輸入的十進
樓主 這是我用連結串列結構實現的棧,以下是演算法,順序表部分沒寫,最近沒什麼時間,不好意思啦。include include 包括malloc 和realloc 函式的標頭檔案 include 包括pow 函式的標頭檔案 define max stack size 20 define addersi...
EXCEL中在一堆數中篩選幾個和等於已知的數怎麼做
你好 可以用自定義篩。如果上圖,或傳沒有敏感資訊的檔案好分析。通過我的程式計算,沒有能夠剛好等於155885的解。最接近的解是 155885.14,比你 的目標多了0.14 268.58,12328,15333.06,19262.5,23490,39969,45234 另一個最接近的解是 15588...