亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

malloc / free是libc提供的syscall還是庫例程?

malloc / free是libc提供的syscall還是庫例程?

慕妹3146593 2019-12-05 15:11:49
如果malloc / free是作為libc中的庫例程實現的,那么它是在sbrk syscall還是mmap syscall或其他東西之上實現的呢?通常,sys / syscall.h中聲明的函數是否包含目標計算機中的所有系統調用?
查看完整描述

3 回答

?
瀟湘沐

TA貢獻1816條經驗 獲得超6個贊

malloc和free是標準C庫函數,其是由每個C實現來實現。


C標準僅定義了這些函數的行為方式以及預期的行為。在每種實現方式中如何實現它們。


簡而言之,它們是您使用的實現的實現細節。


(“實現”由編譯器,鏈接器,運行時庫以及其他一些東西組成。)


查看完整回答
反對 回復 2019-12-05
?
慕碼人8056858

TA貢獻1803條經驗 獲得超6個贊

很多時候,malloc并且free正在使用較低級別的虛擬內存分配服務,并使用諸如mmap和munmap(甚至可能是sbrk)之類的系統調用一次分配多個頁面(甚至兆字節)。相關時,通常傾向于重用以前的 d存儲空間。大多數實現對“大”和“小”分配使用各種不同的策略,等等。malloc freemalloc


注意,可以限制虛擬地址空間,例如使用setrlimit(2)。在Linux pmap(1)和proc(5)上使用,以了解有關某個進程的虛擬地址空間的更多信息(例如,/proc/self/maps對于您自己的進程,或者/proc/1234/maps-對于pmap 1234命令-對于pid 1234的進程)。


您可以查看GNU libc源代碼,其他C標準庫的源代碼(例如musl-libc),了解malloc實現,選擇其他實現或自己實現,或者使用strace進行實驗性查找。


閱讀syscalls手冊頁(即syscalls(2))和<asm/unistd.h>有關系統調用列表的文件。


很快 malloc

(我相信這可能是最快的實現malloc;但是它不是很有用;它符合標準)


我堅信C標準對于malloc和非常模糊free。我很確定以下功能會遵守該標準的文字(但不是精神):


 /* politically incorrect, but very probably standard conforming */

 void *malloc (size_t sz) { if (sz>0) errno = ENOMEM; return NULL; }

 void free(void*ptr) { }

當然,您將進行編碼calloc并realloc據此進行編碼。


(順便說一句,每個使用的代碼malloc都應該測試其失敗,但是某些錯誤地測試錯誤;malloc可以返回NULL失敗,人們應該針對這種情況進行測試)


GNU libc為您提供了自己的函數的鉤子malloc(您甚至可以透明地通過它們使用Boehm的垃圾收集器)。這些掛鉤可能會被棄用并且是非標準的。


如果使用GNU libc,則還要查看mallinfo(3)和malloc_stat(3)以及相關功能。


查看完整回答
反對 回復 2019-12-05
?
繁星coding

TA貢獻1797條經驗 獲得超4個贊

您也可以使用備用實施malloc和free如果您使用的是不同的內存分配器。例如,the 積內存分配器有時用于提高多線程應用程序的性能。


查看完整回答
反對 回復 2019-12-05
  • 3 回答
  • 0 關注
  • 746 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號