Я прочитал похожую статью на http://www.eetimes.com/design/embedded/4024961/Optimizing-Memcpy-improves-speed/, и мне кажется, что
if (!(src & 0xFFFFFFFC) && !(dst & 0xFFFFFFFC))
не проверяет выравнивание указателей.
, например,если src равно 0x13 (нечетно), то src & 0xFFFFFFFC равно 0x10.! (0x10) равно 0, так что if терпит неудачу.отлично.
если src выровнен, скажем, 0x14, то src & 0xFFFFFFFC равен 0x14.! (0x14) равно 0, так что if терпит неудачу.упс.
Я думаю, что это подходящая проверка:
if (!(src & 0x3) && !(dst & 0x3)) {
// pointers are aligned, copy in 32 bit chunks
....
}
и я также не вижу цели в len + = 4;но я предполагаю, что оригинальный вопрос был просто об ошибке компиляции, так что весь этот ответ несколько отступает, и, возможно, я неправильно понял, как это должно работать.(и я согласен с оригинальным ответом, просто используйте то, что есть в библиотеке).