1

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

4

2 回答 2

2

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

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

于 2010-05-24T08:39:48.573 回答
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;
}

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

于 2010-05-24T08:38:47.670 回答