2009-11-03 34 views
0

可以說我有一個c程序,我只使用堆棧變量,沒有動態變量(malloc,...)如何計算程序的內存大小?

是否有可能計算我的程序在運行時需要多少內存?

+0

這取決於編譯器和操作系統。你可能無法可靠地做到這一點。 (也就是說,請記住噸的函數在你的main()函數被執行之前就已經被執行了) – GManNickG 2009-11-03 05:16:48

+0

你想知道程序在一次特定的運行中有多少內存,它在一個特定的點上使用了多少內存或者你想在運行程序之前靜態確定最壞的內存使用情況? – Ned 2009-11-03 08:06:16

回答

1

這不僅取決於操作系統和編譯器像在這裏陳述。

根本不可能一般預先確定它。

例如,如果您使用遞歸調用,您將不得不知道這些調用的參數,並且如果某些參數依賴於用戶輸入或其他不可預知的參數的東西。

當然,你可以做出一些最壞的情況,但通常上限對於大多數問題是無限的。

所以只有當你的程序非常簡單和線性時,你纔可以這樣做。

0

是的,但是這樣做的方法取決於操作系統。你的目標是哪個平臺?

0

是的 - 根據你的編譯器/ os你放在堆棧上的每個對象都有一個大小(例如int - 4字節,但它從編譯器到編譯器,從os到os) - 你可以用sizeof來找到運行時間是您放入堆棧的大小。 最終,程序的szie將是代碼的大小+您創建的堆棧的大小。 (發現代碼的大小比較困難,但是你可以加載程序並在任務管理器中看到它需要多少,如果你在窗口中,這應該給你一些估計)。 我認爲最高層會在Linux上做到這一點。

+0

不正確的是,你沒有考慮堆棧對齊方式(不能在堆棧中推送一個'char',並期望它需要1個字節。而且你錯過了編譯器爲你提供的東西,比如返回地址。 – MSalters 2009-11-04 15:44:11

0

如果Linux的如FC9等,請參閱的/ proc/[PID] /地圖,如:

cat /proc/2738/maps 

那將意義

0

這也取決於你的呼叫跟蹤有多深。 (你是否使用遞歸函數等等。)另外,你的操作系統可以堆棧嗎?

0

有CPU和內存分析工具可用,可幫助您查找程序在運行時需要多少CPU時間或內存。