首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用memcpy/memset

使用memcpy/memset
EN

Stack Overflow用户
提问于 2010-05-24 15:59:58
回答 2查看 1.4K关注 0票数 1

当在Obj-C程序中使用memset或memcpy时,编译器是否会优化设置(memset)或将数据复制(memcpy)到32位写入中,还是会逐个字节执行?

EN

回答 2

Stack Overflow用户

发布于 2010-05-24 16:39:49

您可以在Darwin source中看到这些方法的libc实现。在10.6.3中,memset在单词级别工作。我没有检查memcpy,但可能是一样的。

您说得对,编译器可以内联完成工作,而不是调用这些函数。我想我会让更了解它的人来回答它会做什么,尽管我不认为会有问题。

票数 2
EN

Stack Overflow用户

发布于 2010-05-24 16:38:48

Memset将作为标准C库的一部分出现,因此它取决于您正在使用的实现。我猜大多数实现都会复制原生CPU大小(32/64位)的块,然后逐个字节地复制剩余的块。

下面是一个示例实现的glibc版本的memcpy:

代码语言:javascript
复制
void *
memcpy (dstpp, srcpp, len)
     void *dstpp;
     const void *srcpp;
     size_t len;
{
  unsigned long int dstp = (long int) dstpp;
  unsigned long int srcp = (long int) srcpp;

  /* Copy from the beginning to the end.  */

  /* If there not too few bytes to copy, use word copy.  */
  if (len >= OP_T_THRES)
    {
      /* Copy just a few bytes to make DSTP aligned.  */
      len -= (-dstp) % OPSIZ;
      BYTE_COPY_FWD (dstp, srcp, (-dstp) % OPSIZ);

      /* Copy whole pages from SRCP to DSTP by virtual address manipulation,
     as much as possible.  */

      PAGE_COPY_FWD_MAYBE (dstp, srcp, len, len);

      /* Copy from SRCP to DSTP taking advantage of the known alignment of
     DSTP.  Number of bytes remaining is put in the third argument,
     i.e. in LEN.  This number may vary from machine to machine.  */

      WORD_COPY_FWD (dstp, srcp, len, len);

      /* Fall out and copy the tail.  */
    }

  /* There are just a few bytes to copy.  Use byte memory operations.  */
  BYTE_COPY_FWD (dstp, srcp, len);

  return dstpp;
}

所以你可以看到它先复制几个字节来对齐,然后以字为单位复制,最后以字节为单位复制。它使用一些内核操作进行一些优化的页面复制。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2895564

复制
相关文章

相似问题

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