使用memcpy / memset

时间:2010-05-24 07:59:58

标签: iphone memcpy memset

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

2 个答案:

答案 0 :(得分:2)

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

你是正确的,编译器可以内联工作而不是调用这些函数。我想我会让一个知道更好的人回答它会做什么,虽然我不会指望有问题。

答案 1 :(得分:0)

Memset将作为标准C库的一部分,因此它取决于您使用的实现。我猜大多数实现都将以本机CPU大小(32/64位)的块复制,然后逐字节复制。

以下是glibc用于示例实现的memcpy版本:

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;
}

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