修改 堆棧大小 普適性方案總結 (跨平台 windows linux 棧設置大小)


  1. Loaden
  2. (老鄧)
  3. 等 級:
  4. 2
    2

#5樓 得分:7回復於:2009-04-19 14:31:16

棧的大小可以修改的。在應用程序我們經常需要定義大的數組,數組定義成局部變量非靜態變量,那么數組就會在棧上分配,當數組超過默認棧的大小時,會引起非常內存訪問。那么如何修改系統默認的棧的大小呢。

 

一般,在Unix-like平台,棧的大小不是由程序自己來控制的而是由環境變量來控制的,所以就不能通過設置編譯器(像gcc)的任何編譯標志來設置棧的大小;

//66上面這種說法,是不是,改變了環境,只要不更改回來,所有的相關程序都會受影響。

//windows 影響范圍更小,可以只是當前程序。

//思考,待確認?

 

在windows平台下,棧的大小的信息是包含在可執行文件中的。它可以在Visual C++的編譯過程中設置,但是在gcc中是不可行的。

 

//66待確認??gcc

 

也可以用Microsoft提供的一個叫作:”editbin.exe“程序來直接修改可執行文件的棧的大小。

 

 

在一般情況下, 不同平台默認棧大小如下(僅供參考)

SunOS/Solaris 8172K bytes (Shared Version)

Linux 10240K bytes

Windows 1024K bytes (Release Version)

AIX 65536K bytes

 

 

如果定義大數組的情況下,那就需要修改默認的棧大小,下面給出幾個平台的修改方法:

1.SunOS/Solaris系統:

limit # 顯示當前用戶的棧大小 

unlimit # 將當前用戶的棧大小改為不限制大小

setenv STACKSIZE 32768 #設置當前用戶的棧大小為 32M bytes

 

 

2.Linux系統:

ulimit -a #顯示當前用戶的棧大小

ulimit -s 32768 #將當前用戶的棧大小設置為32M bytes

 

//66上面那個變量 淘寶博客 經常出現。

 

3. Windows (在編譯過程中的設置):

1). 選擇 "Project->Setting".

2). 選擇 "Link".

3. 選擇 "Category"中的 "Output".

4. 在 "Stack allocations"中的"Reserve:"中輸棧的大小,例如: 32768 

 

 

源文檔 <http://topic.csdn.net/u/20090419/13/e30264f9-066e-41f3-adb9-e41a2305b544.html>

 

VS 內存不能read—堆棧空間解決棧溢出問題

分類: VC++2011-08-04 11:06 52人閱讀 評論(0) 收藏 舉報


最近給一個程序添加小功能,在debug下能正常運行,在release下就出現內存不能read,很是費解。但調試跟蹤后找到程序出錯的地方,問題出現在對話框創建的過程中ChannelcfgDlg.Create(IDD_SUB_DLG_CHAN_CFG,&m_settingTab);后來在網上搜索一些資料,發現程序的靜態數據量大的時候,有時候會出現棧溢出問題,往往是程序還沒運行算法呢,就down掉了,在反觀程序中這個對話框類中確實定義了大量的數組。http://wuliang20080412.blog.163.com/blog/static/905220552010320018881/

比如你在創建包含大數組的類(或數據)的時候,棧就溢出了。這是由於系統分配給程序的棧空間太小。

 

一種方法,就是不要靜態分配,用new動態創建,是從堆中分配的,堆的空間足夠大,不過記得寫析構函數,delete你申請的堆空間。其實這樣也挺方便,類結束的時候會自動調用析構函數釋放空間。養成"不在棧上定義大數組/大對象"的好習慣很重要,否則再大的棧也會被撐爆的。

當然,如果你不喜歡new,delete的話,還是靜態分配(畢竟靜態分配有很多好處),那么可以通過改變默認棧空間來解決。

 

LINK的/STACK選項 

  /STACK   :reserve[,commit] 

  reserve:棧總大小 

  commit:程序開始時系統提供的實際內存量 

  缺省:1M,8K 

  參數為0取缺省值 

 

 

今天在VC++.NET中運行聚類程序,老是說Stack   OverFlow,  后來才發現是棧空間太小了。

單單保存100個網頁的數據量就比較大了。

把堆棧的大小已經設置為: 

  堆棧保留大小為:100000000 

  堆棧提交大小為:   100000000; 

就沒問題了。

VS修改:

 

 

在 Visual Studio 開發環境中設置此鏈接器選項

  • 打開此項目的“屬性頁”對話框。有關詳細信息,請參見設置 Visual C++ 項目屬性
  • 單擊“鏈接器”文件夾。
  • 單擊“系統”屬性頁。
  • 修改下列任一屬性:
    • 堆棧提交大小
    • 堆棧保留大小 

問題解答:

 

方法一:STACKSIZE   定義.def文件

 

     語法:STACKSIZE reserve[,commit]

     reserve:棧的大小;commit:可選項,與操作系統有關,在NT上只一次分配物理內存的大小

 

方法二:設定/STACK

     VC6.0修改:

     打開工程,依次操作菜單如下:Project->Setting->Link,在Category 中選中Output,然后

在Reserve中設定堆棧的最大值和commit。

 

注意:reserve默認值為1MB,最小值為4Byte;commit是保留在虛擬內存的頁文件里面,它設置的較

大會使棧開辟較大的值,可能增加內存的開銷和啟動時間

分享到: 

 

 

源文檔 <http://blog.csdn.net/ldanduo/article/details/6659231>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM