Как отметил @Vlad, memmove
& memcpy
в целом высоко оптимизированы, в наши дни они обычно реализуются с SIMD для больших блоков, это означает, что вы должны действительно профилировать свой код, прежде чем тратить время на оптимизацию того, что вы думаю, что является узким местом.
На ваш актуальный вопрос:
у вас нет зацикливания в вашей копии, однако лучше использовать что-то вроде REP MOVSD
для 4-байтовых за раз или REP MOVSQ
на x64 для 8-байтовых за раз. однако, увидев, что ваши данные выровнены на 8 байт, вы даже можете использовать MMX для копирования через MOVQ , что будет делать 64 бита за раз.
Это становится немного сложнее, когда есть перекрывающиеся и другие забавные угловые случаи, но из-за их звуков вам это не нужно / не нужно, так что на самом деле лучший подход может быть самым наивным (это просто копии, которые ускорят процесс, если вам не нужна другая семантика memmove
):
void MyMemCopy(void* pSrc, void* pDst, int nElements)
{
int64_t* s = (int64_t*)pSrc;
int64_t* d = (int64_t*)pDst;
while(nElements--)
*d++ = *s++;
}
теперь компилятор, если вы можете оптимизировать его наилучшим образом, будь то встраивание или развертывание и т. Д., И у вас нет проблем с переносимостью ASM