[英]how to manipulate size of stack in c
可以說我有一個ac程序,其中只使用堆棧變量,不使用動態變量(malloc,...)
是否可以計算出我的程序在運行時需要占用多少內存? 是否可以更改堆棧的大小?
首先,C標准對運行時堆棧沒有什么可說的。 編譯器可以自由使用他們希望實現C行為的任何數據結構。有些編譯器在堆上使用了鏈表,這很好。
因此,僅假設我們具有或多或少的標准C實現,即可將返回地址,參數和局部變量放在堆棧中。
沒有算法(因此沒有人)會成功地正確預測任意計算機程序所需的堆棧大小。 這是計算機理論的基本結果:從停頓問題的簡單減少。
但是,您可以在程序上施加規則,以預測最大大小的堆棧。 簡而言之,您不允許任何形式的遞歸(包括常規遞歸:A調用B調用C調用A),並且您不在堆棧上分配可變大小的數據(例如,使用alloca()
或可變大小的數組)。
在起搏器和飛行控制等對安全至關重要的系統中,這類規則是非常常見的做法。 可以通過軟件工具進行檢查,並且這些工具存在於安全性至關重要的系統設計中,盡管它們往往是專有的。
正如@Jonathon Reinhart所說,每種操作系統的建立堆棧大小的過程是不同的。
Linux和Unix變體使用rlimit
和ulimit
方案,其中堆棧大小是用戶資源的約束。
Windows將堆棧限制與每個程序相關聯。 您還可以通過Job Objects獲得rlimit
的控件。
相反,我不知道在Linux可執行文件中是否有類似Windows的方法來設置堆棧大小限制,但是得知有這種方法不會感到驚訝。
在Linux上,您可以使用setrlimit(RLIMIT_STACK,...)
更改堆棧大小限制。
在Windows上,堆棧大小是在線程初始化時通過dwStackSize
參數設置為CreateThread
。 要在編譯時進行更改,請將/F
(設置堆棧大小)傳遞給編譯器
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.