我听说memcpy
是复制数据的非常有效的算法。为了给我的代码吸取一些教训,我决定研究它在GNU中的实现。但是,对于大的内存块,它会进行一些检查,然后calls a PAGE_COPY_FWD macro——我在任何地方都找不到defined。
mem-cpy源代码的最后一个链接是:
System-specific pagecopy.h files should define these macros and then
#include this file:
...
PAGE_COPY_FWD (dstp, srcp, nbytes_left, nbytes)
两个问题:
1)如何找到该宏的实现?(在任何地方——无论是在我的机器上,还是在其他人的机器上——即使这意味着我必须阅读程序集代码。)
2)要直接调用该宏,即不首先通过memcpy,必须包括哪些内容?
最佳答案
我找到了PAGE_COPY_FWD
的定义
#define PAGE_COPY_FWD(dstp, srcp, nbytes_left, nbytes) \
((nbytes_left) = ((nbytes) - \
(__vm_copy (__mach_task_self (), \
(vm_address_t) srcp, trunc_page (nbytes), \
(vm_address_t) dstp) == KERN_SUCCESS \
? trunc_page (nbytes) \
: 0)))
在这里找到的https://www.sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/mach/pagecopy.h