0

memcpy 和 memset 等 C 函数可用作C函数以及 iOS 中的 #define:

例如,引擎盖下的#define memcpy 是:

#define memcpy(dest, src, len)                  \
((__darwin_obsz0 (dest) != (size_t) -1)             \
 ? __builtin___memcpy_chk (dest, src, len, __darwin_obsz0 (dest))   \
 : __inline_memcpy_chk (dest, src, len))
  1. 我收集这里有一些内存检查,但有人可以提供一些额外的细节,说明为什么它比单独的 memcpy 更好(增值在哪里)?

  2. 更重要的是,什么时候用哪个?

4

3 回答 3

2

__inline_memcpy_chk编译器使用这些名称来帮助优化memcpy. 它们是与编译器的内置功能相对应的特殊名称。它们帮助它将某些用途转换memcpy为比调用memcpy库例程更快的代码。结果可能是简单的移动指令,或者更有效的是编译器内部信息的简单更改,以便它知道寄存器中的值的副本可用。

如果您取消定义宏memcpy以便不使用这些内置功能(这是 C 标准所允许的),则该memcpy例程仍然可以工作,但它的效率可能低于您不理会它的效率。

通常,您不应尝试自己调用这些内部名称。它们的设计和定义是为了使正常使用memcpy高效。

于 2013-05-19T02:12:53.573 回答
1

除非你#undef是宏,或者像这样调用它(memcpy)(args...),否则它将始终使用宏变体。

我个人只会使用maco - 它旨在快速高效,并且可以按您的预期工作。

于 2013-05-19T01:21:01.740 回答
1

为了回答您的问题,

1)我没有其他细节,但是像这样偷看引擎盖违反了作者为您提供的抽象。你想要 memcpy,你有 memcpy,因为他们在那里提供了它,用你展示的代码片段实现。如果你好奇它是如何工作的,你可以深入研究它,但因为你问“何时使用哪个”,我怀疑你试图找出在实践中有效的东西。这得到了你第二个问题的答案......

2) 你应该使用 memcpy(dest, src, len)。不要绕过#define 并以非预期的方式使用底层代码。为您提供了 memcpy() ,因为它在那里;对你来说,那就是memcpy。

于 2013-05-19T01:21:08.750 回答