iOS中的某些C函数重复为#define

时间:2013-05-19 00:56:49

标签: ios objective-c c c-preprocessor memcpy

C 函数(如memcpy和memset)可用作 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. 更重要的是,何时使用哪个?

3 个答案:

答案 0 :(得分:2)

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

如果您取消定义宏memcpy以便不使用这些内置功能(C标准允许),memcpy例程仍然有效,但效果可能不如如果你把它一个人留下。

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

答案 1 :(得分:1)

除非您#undef宏,或称之为(memcpy)(args...),否则它将始终使用宏变体。

我个人只是使​​用maco - 它的目的是快速有效,并且可以按预期工作。

答案 2 :(得分:1)

回答你的问题,

1)我没有其他详细信息,但是在引擎盖下窥视违反了作者为您提供的抽象。你想要memcpy,你已经在那里提供了memcpy,用你正在展示的片段实现。如果你很好奇它是如何工作的,你可以深入研究它,但是因为你问“何时使用哪个”我怀疑你是想弄清楚在实践中有用的东西。哪个得到你的第二个问题的答案......

2)你应该使用memcpy(dest,src,len)。不要乱砍#define并以非预期的方式使用底层代码。你已经提供了memcpy();对你而言, memcpy。