memmove
- не единственная реализация в современных компиляторах; вместо этого он считается внутренним. Проще всего показать на примере, как работает «как будто» :
#include <string.h>
void test_memmove(void * restrict dst, const void * restrict src, size_t n) {
memmove(dst, src, n);
}
параметры restrict
говорят о том, что память, доступ к которой осуществляется через указатели, не перекрывается. Так что GCC знает, как скомпилировать это в
test_memmove:
jmp memcpy
Поскольку компилятор смог учесть restrict
и «доказать», что области памяти, на которые указывают эти 2, не перекрываются, вызов memmove
был немедленно изменен на (хвостовой) вызов memcpy
!