| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 964 人关注过本帖, 1 人收藏
标题:動態分配内存malloc()的一些測試結果
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
其實,我1樓給出MSDN的解釋已經很清楚了:malloc()將會獲得不少於申請的空間,但這個塊也可能大於所申請的,因爲需要對齊和維護一些信息(alignment and maintenance)。那段英文并不複雜,關鍵部分也描紅了。測試結果衹是證實了這段話而已。btw: 那個需要維護的信息,我猜可能是塊大小,因爲用free()釋放的内存不需要再給出尺寸了,系統怎麽知道原來申請的是多少,那一定是在這空間中有地方儲存起來的。

1樓的代碼,申請的是1000字節,但實際上是1024字節,不是申請多少給多少,也不是4096。


[ 本帖最后由 TonyDeng 于 2015-2-14 11:57 编辑 ]

授人以渔,不授人以鱼。
2015-02-14 11:45
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
在Windows中,進程的虛擬内存是它單獨佔有的(這也是NT之後實際上不需要釋放動態申請内存的原因,因爲操作系統確保在進程結束之後把這些内存全部抹掉,不是像DOS/Win98那樣會有内存泄漏),不會有別的進程過來干擾,申請必定是按順序依次分配,這是可想而知的。一個32位的進程,它擁有接近2GB的虛擬内存(對我們所寫的普通程序來説,這已是極奢侈的資源,不釋放内存基本上沒什麽問題),誰寫的内存管理程序還會到處搜尋空隙降低效率?

1024這個結果,也表明malloc()的分配不是頁尺寸4096。

順帶說一下:MS系統的棧尺寸默認是1M,以我以前DOS時代的編程經驗來説,已經怎麽都用不完(大尺寸數據是在堆上申請的),不知道gcc預設4M是怎麽用的。


[ 本帖最后由 TonyDeng 于 2015-2-14 12:05 编辑 ]

授人以渔,不授人以鱼。
2015-02-14 11:54
猫林heart
Rank: 5Rank: 5
等 级:职业侠客
威 望:1
帖 子:60
专家分:390
注 册:2014-9-26
收藏
得分:25 
要学习的真多
2015-02-14 19:38
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
後面再測試了一下,一般是比申請的大24字節,隨著申請塊的增大而增大,有到32字節的。但是,MS的堆内存管理顯然有某種算法,在多次申請之後,偶爾某塊會跳回到前面,好像與申請塊的大小有關,有大數據堆和小數據堆,具體規律暫時沒測出來。

那個百度說申請多少給多少,估計是看_msize()函數返回的值來說的,但那個不過是如strlen()返回字符串長度那樣的值,大家都知道字符數組真正佔用的空間是strlen()返回值加1,這個也一樣。尤其在面向對象的環境中,對象返回的一些尺寸是給你看的,它真正佔用的尺寸,你猜都不要猜——編程規範確實是這般告誡程序員的。在C中,FILE這個數據結構,就是典型的對象結構,標準庫手冊也勸告程序員不要以爲可以看到它的某些字段,就一知半解地亂改數據,因爲它隱藏的東西、以及怎麽使用的暗手段,是你不知道的。

授人以渔,不授人以鱼。
2015-02-14 19:53
chimeixing
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:14
专家分:130
注 册:2010-10-19
收藏
得分:0 
回复 4楼 TonyDeng
"在堆上,理论上也如此"
堆和栈的实现明显是有很大不同的,不知道这个理论是从哪里看到的呢?

菜鸟
2015-02-15 16:55
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
毫无意义的研究。

My life is brilliant
2015-02-15 16:58
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用chimeixing在2015-2-15 16:55:43的发言:

"在堆上,理论上也如此"
堆和栈的实现明显是有很大不同的,不知道这个理论是从哪里看到的呢?

舉個例子:“理論上人人平等”,“理論上你是很聰明的”,這都是什麽理論?堆和棧在實現上的確有不同,但往一個方向發展是正常的想法。這個東西,實測也的確是向一個方向發展的,衹是在積纍到一定程度(大概分配10次左右)就往回跳一下不知是什麽原因,具體是怎麽回事,沒有做可視化的觀察,暫時說不上來。不過,正如有人說的,探討這個細節沒多大用處,因爲我前面說了,寫程序不做那些假定,不刻意利用副作用,什麽事都沒有。它跟“對齊”是同一性質的,不要假定結構體中每個字段是緊密相鄰的,不要假定結構體有2個char就以爲結構體的尺寸是2Byte,等等。在這裏,我尤其要指出的是,不要用malloc()申請太小的數據空間,堆的浪費往往超乎想象,碎片化的問題其實真的很嚴重。

我這個測試,初衷是針對有人說動態分配空間是申請多少給多少,直覺上就認爲那是不可能的。棧有對齊,堆也不會例外,這就是“理論”。


[ 本帖最后由 TonyDeng 于 2015-2-16 11:08 编辑 ]

授人以渔,不授人以鱼。
2015-02-16 11:02
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
收藏
得分:0 
看了十七楼的说明 总算有点明白楼主的意图了

Only the Code Tells the Truth             K.I.S.S
2015-02-16 12:13
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
這個測試,同時也證實了我的一個猜想:用malloc()分配一塊内存,在free()時是不需要給出當時申請大小的,那麽它如何釋放内存?事實上,我也測試了連續分配100次每次1個char的情形,結果顯示每次之間的間隔是24字節,1個char耗費24byte呀!

授人以渔,不授人以鱼。
2015-02-16 12:40
快速回复:動態分配内存malloc()的一些測試結果
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020373 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved