2014-12-04 76 views
2

當我在我SO閱讀了大量的意見引導(特別是在C)直接堆棧和堆訪問;虛擬或硬件級別?

「動態分配永諾去堆,在堆棧上自動分配」

但是,尤其是關於爲純CI disaggree接着就,隨即。由於ISO/IEC9899甚至沒有放棄堆棧或堆棧。它只提到了三個存儲過程(靜態,自動和分配),並建議如何處理每個存儲過程。

什麼會讓編譯器的選項做到這一點,即使是相反,如果它願意。

所以我的問題是:

是堆和現有堆物理是(即使不是在C)一種標準化的語言可以說」 ...有發生在堆和...棧上「?

或者他們只是一個管理內存訪問的virtuell系統,因此語言無法制定有關它們的規則,因爲甚至無法保證環境支持它們?

在我的知識庫中,只有第二個纔有意義。但是我多次閱讀寫評論的人,比如「在XY語言中這會發生在堆棧/堆上」。但是,如果我是對的,只要語言不僅僅是爲了保證有堆棧和堆的系統而做的,這就必須是不確定的。所有的評論都是錯誤的。

那是什麼讓我問這個問題。我是否錯了,或者在推理過程中出現了很大的錯誤?

+0

可能的重複[什麼和堆棧和堆?](http://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap) – MatthiasB 2014-12-16 10:44:15

+0

@Matthias嚴重?這篇文章詢問關於堆和堆棧被視爲更多的虛擬或物理系統。在問這個問題之前,我讀了你寫的那篇文章,我可以用純粹的良知說,甚至連我在這裏提到的問題的方面都沒有提到。所以不,絕對不是重複的。 – dhein 2014-12-16 10:52:28

+0

[這個答案](http://stackoverflow.com/a/13326916/1810521)似乎是一個很好的回答你的問題,也就C編譯器。 – MatthiasB 2014-12-16 12:30:09

回答

2

你說得對,C規範不要求使用堆或堆棧,只要它正確地實現了存儲類。然而,實際上每個編譯器都會使用自動變量和堆分配變量的堆棧。雖然你可以實現一個不使用堆棧或堆的編譯器,但它可能不會很好,大多數開發人員都不會很熟悉。

所以當人們說「永遠」時,他們真的是指「幾乎總是」。

+0

只是另一個方面:想象一個分配存儲類型的內存塊。它被分配和釋放的範圍內,在任何情況下都不會遺留存儲空間。如果塊足夠小,編譯器僅僅使用堆棧上的內存不是一件好事嗎?所以對於這種情況:在這種情況下,「malloc將會堆在」堆棧語句甚至是錯誤的嗎? ;) – dhein 2014-12-16 10:46:18

+0

@Zaibis:編譯器無法預測一般函數何時會被調用,所以它不知道堆棧中調用的深度有多大=>無法知道「足夠小」是什麼。 (這是假設編譯器知道有多少堆棧可用 - 它通常不能,運行時/操作系統可以配置不同的堆棧大小/限制。) – Mat 2014-12-16 11:09:58

+0

@Mat好的,關於我認同的東西有多深。但編譯器可以知道(它甚至可以設置!)堆棧大小。所以它可以與小什麼和小什麼不相關。所以可以說我們有一個2MB的堆棧。還有一個是malloc(),一個4字節的塊,在任何方式釋放之前,該範圍內的另一個被分配或範圍剩下。如果你深入瞭解它,它會減少4個字節,比你不應該打開編譯器優化,也不要依賴「程序不會崩潰」。這樣做是不尋常的,也許甚至沒有任何編譯器這樣做。但事實是:它不會違反任何法律! – dhein 2014-12-16 12:02:08