3 回答

TA貢獻1816條經驗 獲得超6個贊
malloc和free是標準C庫函數,其是由每個C實現來實現。
C標準僅定義了這些函數的行為方式以及預期的行為。在每種實現方式中如何實現它們。
簡而言之,它們是您使用的實現的實現細節。
(“實現”由編譯器,鏈接器,運行時庫以及其他一些東西組成。)

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)以及相關功能。
- 3 回答
- 0 關注
- 746 瀏覽
添加回答
舉報