簡體   English   中英

如何在C中操縱堆棧大小

[英]how to manipulate size of stack in c

可以說我有一個ac程序,其中只使用堆棧變量,不使用動態變量(malloc,...)

是否可以計算出我的程序在運行時需要占用多少內存? 是否可以更改堆棧的大小?

首先,C標准對運行時堆棧沒有什么可說的。 編譯器可以自由使用他們希望實現C行為的任何數據結構。有些編譯器在堆上使用了鏈表,這很好。

因此,僅假設我們具有或多或少的標准C實現,即可將返回地址,參數和局部變量放在堆棧中。

沒有算法(因此沒有人)會成功地正確預測任意計算機程序所需的堆棧大小。 這是計算機理論的基本結果:從停頓問題的簡單減少。

但是,您可以在程序上施加規則,以預測最大大小的堆棧。 簡而言之,您不允許任何形式的遞歸(包括常規遞歸:A調用B調用C調用A),並且您不在堆棧上分配可變大小的數據(例如,使用alloca()或可變大小的數組)。

在起搏器和飛行控制等對安全至關重要的系統中,這類規則是非常常見的做法。 可以通過軟件工具進行檢查,並且這些工具存在於安全性至關重要的系統設計中,盡管它們往往是專有的。

正如@Jonathon Reinhart所說,每種操作系統的建立堆棧大小的過程是不同的。

Linux和Unix變體使用rlimitulimit方案,其中堆棧大小是用戶資源的約束。

Windows將堆棧限制與每個程序相關聯。 您還可以通過Job Objects獲得rlimit的控件。

相反,我不知道在Linux可執行文件中是否有類似Windows的方法來設置堆棧大小限制,但是得知有這種方法不會感到驚訝。

在Linux上,您可以使用setrlimit(RLIMIT_STACK,...)更改堆棧大小限制。

在Windows上,堆棧大小是在線程初始化時通過dwStackSize參數設置為CreateThread 要在編譯時進行更改,請將/F (設置堆棧大小)傳遞給編譯器

暫無
暫無

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

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