看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《deh3215 (黑金屬魂)》之銘言: : 例如實作fopen,fclose : 補充說明(Supplement): : 如果是strcpy之類的,大概較簡單些...如果是fopen,fclose,malloc這類的API : 該如何自己實作? 實作不就只是依API的contract, 處理input與產生output? 跟寫一般 function 並沒有太大的不同. 像 strcpy/memcpy 這些都是純 user-space, os-independent 的東西, 但常被上層的 API 大量使用, 所以實作上會多考量 arch-depedent 的 optimization 有些 API 甚至會用 assembly code 實作 像 fopen/fread/malloc, 這些是 os-dependent 像 warpper 包住下層的 syscall/os-api 實作上會要考慮減少 syscall 的次數, 因為 syscall的 overhead 非常大 比如說 void * memset (void *dst, int value, size_t n); 概念上不過就只是 char *pdst = (char*)dst; while (n--) *pdst++ = value; 但要做的有效率, 通常會考慮 loop unrolling, eliminate branch, aligment, cache... 例如 一次 set 一個 word int32_t *pdst = (int32_t*)dst; value &= 0xff; value |= (value << 8) | (value << 16) | (value << 24); n = n >> 2; /* 簡化問題, 所以假設 n 一定是4的倍數) while (n--) *pdst++ = value; 簡少了 store (memory access)與loop的次數 但還要考慮CPU能不能處理 unaligned 的 access (很多RISC不行) (dst不保證 aligned word) 就算像 x86, unaligned 也會比較沒效率, 所以一般會切三塊, 前後不align的部份, 中段 align的部份 若是 void * malloc(size_t size); 一般會用 OS 提供的 API, 一次要一塊大的 然後由 malloc/free 自已維護 free/used list 像是 Windows 的 VirtualAlloc 或 Linux 的 mmap, 可以一次要一塊以 page 為單位且 align page boundary 的memory block, 再切出所需的size. memory 的部份可以參考 Advanced Memory Allocation http://www.linuxjournal.com/article/6390 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.251.227.151
VictorTom:推:) 06/03 01:54
hilorrk: 推:) 06/03 03:00
weiyucsie:推:) 06/03 03:31
xatier: 推:) 06/03 08:03
softwind:memcpy 都是用 asm code, 除非你的CPU太稀奇... 06/03 13:39
tomnelson:講得很清楚, 不過memcpy部份其實有很多針對CPU最佳化的 06/03 15:45
tomnelson:東西, 例如用MMX/SSE/SSE2等的版本, 而且據了解, 這才是 06/03 15:45
tomnelson:真實世界現行在很多平台上採用的, 當然原理就如原po講的 06/03 15:46
tomnelson:那一兩行C語言程式就搞定了. 06/03 15:47
deh3215: 06/03 23:27
tomap41017:推阿:)好棒 06/04 01:40
angleevil:看了三四次,才大概懂.QQ學無止盡阿 06/04 20:44
ikari512:推!!! 09/10 03:48