Re: [討論] 如果想實作C的function或API,該怎麼了렠…
※ 引述《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
06/03 13:39, 5F
推
06/03 15:45, , 6F
06/03 15:45, 6F
→
06/03 15:45, , 7F
06/03 15:45, 7F
→
06/03 15:46, , 8F
06/03 15:46, 8F
→
06/03 15:47, , 9F
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
06/04 20:44, 12F
推
09/10 03:48, , 13F
09/10 03:48, 13F