Question: Can I use C to know whether a file operation is performed (and where it is performed) on the disk at run time?

Answer: 
Assuming a sane library implementor, `memcpy` will always be at least as fast as `memmove`. However, on most platforms the difference will be minimal, and on many platforms `memcpy` is just an alias for `memmove` to support legacy code that (incorrectly) calls `memcpy` on overlapping buffers.

Both `memcpy` and `memmove` should be written to take advantage of the fastest loads and stores available on the platform.

To answer your question: you should use the one that is semantically correct. If you can guarantee that the buffers do not overlap, you should use `memcpy`. If you cannot guarantee that the buffers don't overlap, you should use `memmove`.
On some ARM platform im working on, memmove was 3 times faster than memcpy for short unalligned load. As memcpy and memmove are the only truly portable type-punning mechanism, you would have thought that the would be some check by the compiler before trying to use the NEON to do it.