日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言申请内存时堆栈大小限制

發(fā)布時(shí)間:2023/12/2 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言申请内存时堆栈大小限制 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.


一直都有一個(gè)疑問,一個(gè)進(jìn)程可以使用多大的內(nèi)存空間,swap交換空間以及物理內(nèi)存的大小,ulimit的stack size對進(jìn)程的內(nèi)存使用有怎樣的限制?今天特親自動(dòng)手實(shí)驗(yàn)了一次,總結(jié)如下:

開辟一片內(nèi)存空間有2種方式,第一種:int a[];第二種malloc,那么在Linux下,這兩種方式可以開辟多大的內(nèi)存空間呢?下面依次進(jìn)行實(shí)驗(yàn):

第一種方式:使用malloc申請內(nèi)存;

這樣的方式是在堆區(qū)申請的內(nèi)存,在linux中,其實(shí)是在申請的時(shí)候基本沒有限制,比如32位機(jī)器,理論上可以malloc(4G)的大小,因?yàn)?^32=4G,但事實(shí)上linux的進(jìn)程地址空間是這樣的:


所以經(jīng)過實(shí)驗(yàn),使用malloc最大能夠申請的空間是3G左右,這里要注意,要使用下面這樣的方式申請空間:

[cpp]?view plaincopy
  • int?MB?=?0;??
  • ????????while(malloc(1?<<?20))??
  • ????????{??
  • ????????????????MB++;??
  • ????????}??
  • ????????printf("Allocate?%d?MB?total\n",?MB);??

  • 不能直接

    [cpp]?view plaincopy
  • size_t?MB?=?(size_t)(2147483648UL);??
  • ?char?*buf?=?(char*)malloc(MB);??

  • 因?yàn)榭赡軆?nèi)存中存在碎片,內(nèi)存空閑空間總和也許有3G,但是直接申請3G,可能會(huì)不成功,因?yàn)樗皇沁B續(xù)的內(nèi)存空間。


    接下來我又迷茫了,為什么申請堆空間不受到swap空間和物理內(nèi)存大小的限制呢?由于linux使用的是虛擬內(nèi)存,因此分配是不受影響的,但是,在使用的時(shí)候,我們同時(shí)使用的內(nèi)存大小超過了swap空間和物理內(nèi)存大小,將會(huì)出現(xiàn)一些問題,這里有一篇文章說得不錯(cuò),記錄下:http://www.cfanz.cn/index.php?c=article&a=read&id=103888




    第二種方式:使用int a[]申請內(nèi)存;

    這樣的方式是在棧區(qū)申請的內(nèi)存,在linux中,會(huì)受到ulimit -a中stack size結(jié)果的影響

    比如我的ulimit -a結(jié)果

    [cpp]?view plaincopy
  • stack?size??????????????(kbytes,?-s)?8192??
  • 那么代碼中

    [cpp]?view plaincopy
  • //??????int?MB[2097152];?4*2097152?=?8192kb??
  • ????????int?MB[2090000];??
  • ????????MB[0]?=?0;??
  • ????????MB[2090000?-?1]?=?0;??
  • [cpp]?view plaincopy
  • int?MB[2097152];??
  • 使用int MB[2097152]會(huì)失敗,因?yàn)槎褩?赡鼙4鎱?shù),返回地址等等信息,已經(jīng)占用了部分堆棧,下面的MB[2090000]是可以成功的!


    所以總結(jié)一下:如果用malloc的方式,一個(gè)進(jìn)程理論上是可以使用3G的內(nèi)存(應(yīng)該說可見),但是同時(shí)能夠使用的真正最大內(nèi)存只有swap空間+物理空間這么大

    使用int a[]這樣的形式,申請的空間會(huì)受到ulimit -a中stack size的影響。


    ps:其實(shí)我覺得堆棧就不應(yīng)該一起說~他倆的概念還是差很多的~我搜到的文章都把這兩者混在一起說,非常容易迷惑人.....


    記錄下參考的文章:

    http://www.cfanz.cn/index.PHP?c=article&a=read&id=103888

    http://blog.csdn.NET/anghlq/article/details/7087069

    http://tech.ddvip.com/2013-05/1369680397196183.html

    http://www.jb51.net/LINUXjishu/34605.html

    總結(jié)

    以上是生活随笔為你收集整理的C语言申请内存时堆栈大小限制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。