1.堆棧多大?它是處理器/架構/編譯器依賴嗎?
堆棧的大小由存儲器的量的平臺和的存儲器由操作系統分配給進程的量上的限制。
2.是否有一種方法可以確切知道我的函數/類堆棧有多少內存可用,以及當前使用了多少內存以避免溢出?
沒有用於確定可用內存量的C或C++工具。對此可能有特定於平臺的功能。一般來說,大多數程序試圖分配內存,然後爲分配失敗提供解決方案。
3.在現代計算機上使用現代編譯器(比如說gcc 4.5)(例如6 GB RAM),我需要擔心堆棧溢出還是過去的事情?
堆棧溢出可能發生取決於程序的設計。無論內存大小如何,遞歸都是耗盡堆棧的一個很好的例子。
4.實際的堆棧內存物理地位於RAM或CPU緩存上嗎?
平臺依賴。一些CPU可以用堆棧中的局部變量加載它們的緩存。關於此主題的各種場景。未在語言規範中定義。
5.與堆訪問和讀取相比,堆棧內存訪問和讀取速度快多快?
我意識到時間是PC特定的,所以一個比例就足夠了。
通常速度沒有差別。取決於平臺如何組織其物理內存以及如何佈置可執行文件的內存。堆或棧可以駐留在串行存取存儲器芯片(一種緩慢的方法)或甚至在閃存芯片上。未在語言規範中指定。
6.我讀過了,建議在堆棧上分配大的變量/對象是不可取的。多大太大?這裏的問題給出了一個1MB的線程在win32中的答案。如何在Linux amd64中的線程?
最好的建議是根據需要分配本地小變量(也可以通過堆棧)。巨大的項目是從動態存儲器(a.k.a.堆)或某種全局(靜態本地函數或本地到翻譯單元甚至是全局變量)分配的。如果大小在編譯時已知,則使用全局類型分配。在運行期間大小可能會更改時使用動態內存。
該堆棧還包含有關功能地址的信息。這是不能在本地分配大量對象的一個主要原因。一些編譯器對堆棧的限制比對堆或全局變量的限制更小。前提是嵌套函數調用比大數據數組或緩衝區需要更少的內存。
請記住,切換線程或任務時,操作系統需要在某處保存狀態。操作系統可能有不同的規則來保存堆棧內存與其他類型的內存。
我認爲這會更好地分解成幾個更有針對性的問題。 –
它涵蓋的範圍太廣泛,只有一個答案,實際上,它是10個完全不同的問題。 – littleadv
我應該怎麼做?拿出一些問題,並在另一個線程中詢問他們? –