2016-01-06 71 views
-2

這是我的印象,這樣做如何找出堆棧內存中的數組大小?

void stuff() { 
    int arr[1000]; 
    //do some stuff 
} 

然後陣列時既可以在堆上分配或取決於其大小和CPU的限制堆棧存儲器。

我正在優化一個腳本,bruteforce測試一些計算,因爲估計的時間目前是幾個星期,我想盡可能地降低它,獲取儘可能多的樣本數據以適應堆棧幫助我想。

有沒有辦法找出我可以聲明的數組有多大?

+2

在您的示例中,它始終分配在堆棧上。這可能會導致堆棧增長(或溢出),當然(這可能會導致堆空間減少),但它仍然在堆棧中。最大堆棧大小完全取決於您的平臺 - 您的平臺是什麼? (Windows x86-64?) – Cameron

+1

「儘可能多地獲取樣本數據,可以幫助我思考」你爲什麼這麼想?當涉及到優化暴力計算時,第一站就是停止暴力破解,並開始變得更聰明。 –

+0

@Cameron是的,Windows x86-64 – user81993

回答

1

典型的現代機器上的堆棧有所不同,但通常大約爲/小於5 MB。在嵌入式平臺上可能會少得多。有些平臺允許爲創建線程的堆棧大小指定一個提示,但通常這些只是提示,並不嚴格遵循。

另外,放置在堆棧上的對象有多大取決於當前的堆棧深度,您可能在堆棧的開始處或接近其結束處。你不能預先說明,我的意思是在編碼時,這是指定堆棧數組大小的時間和地點。在一個簡單的例子中,你可能會認爲你會在堆棧的開始,但是在生產代碼中,函數調用可能會嵌套在難以預測的順序和深度中,或者如果依賴於用戶輸入,它們甚至是不可能的。

我不知道是否有任何可移植的方式,但平臺的具體方式是將對象放在堆棧上並測量其地址和堆棧結束之間的差異,這會在運行時給你您已經離開的堆棧空間。無論如何,如果你的目的是把一個大對象放在堆棧上,你不會因爲不使用堆內存分配而獲得太多收益,內存分配的懲罰可以忽略不計,並且之後訪問數據從它的速度將會像它在堆棧上一樣快,另外的好處是它不依賴於有限的堆棧大小。

堆棧的目的不是存儲程序的批量數據,而是跟蹤程序的核心結構,使其可以運行。不要將批量數據放在堆棧上。由於這個意圖,堆棧大小几乎總是不超過幾兆字節,即使對於打算使用千兆字節內存的應用程序也是如此。