首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么memcpy()和memmove()比指针增量更快?

为什么memcpy()和memmove()比指针增量更快?
EN

Stack Overflow用户
提问于 2018-04-19 05:14:46
回答 2查看 0关注 0票数 0

我正在复制N个字节pSrcpDest。这可以在一个循环中完成:

代码语言:txt
复制
for (int i = 0; i < N; i++)
    *pDest++ = *pSrc++

为什么这比memcpymemmove?他们用什么技巧来加快速度?

EN

回答 2

Stack Overflow用户

发布于 2018-04-19 13:20:55

因为memcpy使用单词指针而不是字节指针,所以memcpy实现也经常用simd指令,这使得一次洗牌128位成为可能。

SIMD指令是可以对向量中的每个元素执行相同操作的汇编指令,长度可达16字节。这包括加载和存储指令。

票数 0
EN

Stack Overflow用户

发布于 2018-04-19 15:02:00

通过指针,内存复制例程可能比简单的内存复制要复杂得多,而且速度更快,例如:

代码语言:txt
复制
void simple_memory_copy(void* dst, void* src, unsigned int bytes)
{
  unsigned char* b_dst = (unsigned char*)dst;
  unsigned char* b_src = (unsigned char*)src;
  for (int i = 0; i < bytes; ++i)
    *b_dst++ = *b_src++;
}

改进

可以做的第一个改进是对齐单词边界上的指针之一(字I指本机整数大小,通常为32位/4字节,但在较新的体系结构中可以是64位/8字节),并使用字大小的移动/复制指令。这需要使用字节对字节复制,直到指针对齐为止。

代码语言:txt
复制
void aligned_memory_copy(void* dst, void* src, unsigned int bytes)
{
  unsigned char* b_dst = (unsigned char*)dst;
  unsigned char* b_src = (unsigned char*)src;

  // Copy bytes to align source pointer
  while ((b_src & 0x3) != 0)
  {
    *b_dst++ = *b_src++;
    bytes--;
  }

  unsigned int* w_dst = (unsigned int*)b_dst;
  unsigned int* w_src = (unsigned int*)b_src;
  while (bytes >= 4)
  {
    *w_dst++ = *w_src++;
    bytes -= 4;
  }

  // Copy trailing bytes
  if (bytes > 0)
  {
    b_dst = (unsigned char*)w_dst;
    b_src = (unsigned char*)w_src;
    while (bytes > 0)
    {
      *b_dst++ = *b_src++;
      bytes--;
    }
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100003933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档