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))
我认为这里有一些内存检查,但有人可以提供一些额外的细节,说明为什么它比单独的memcpy更好(增值的位置在哪里)?
更重要的是,何时使用哪个?
答案 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。