Re: [討論] 如果想實作C的function或API,該怎麼了렠…

看板C_and_CPP作者 (躂躂..)時間13年前 (2011/06/03 01:45), 編輯推噓10(1003)
留言13則, 10人參與, 最新討論串1/1
※ 引述《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

06/03 01:54, , 1F
推:)
06/03 01:54, 1F

06/03 03:00, , 2F
推:)
06/03 03:00, 2F

06/03 03:31, , 3F
推:)
06/03 03:31, 3F

06/03 08:03, , 4F
推:)
06/03 08:03, 4F

06/03 13:39, , 5F
memcpy 都是用 asm code, 除非你的CPU太稀奇...
06/03 13:39, 5F

06/03 15:45, , 6F
講得很清楚, 不過memcpy部份其實有很多針對CPU最佳化的
06/03 15:45, 6F

06/03 15:45, , 7F
東西, 例如用MMX/SSE/SSE2等的版本, 而且據了解, 這才是
06/03 15:45, 7F

06/03 15:46, , 8F
真實世界現行在很多平台上採用的, 當然原理就如原po講的
06/03 15:46, 8F

06/03 15:47, , 9F
那一兩行C語言程式就搞定了.
06/03 15:47, 9F

06/03 23:27, , 10F
06/03 23:27, 10F

06/04 01:40, , 11F
推阿:)好棒
06/04 01:40, 11F

06/04 20:44, , 12F
看了三四次,才大概懂.QQ學無止盡阿
06/04 20:44, 12F

09/10 03:48, , 13F
推!!!
09/10 03:48, 13F
文章代碼(AID): #1Dvymz5U (C_and_CPP)