memmove смотрит какой указатель меньше и в зависимости от этого копирует с начала или конца. Если интересно, напиши в лс, пришлю свою старую реализацию обеих функций в Си
Вообще, я не очень понимаю, в чем плюс копирования с конца? Там memcpy внутри sse, avx и прочее юзает, за одну инструкцию сразу блок копирует большой и этот блок как раз может пересечься с dest. В этом суть ограничения с пересечением областей