本文介绍了了解的memcpy源$ C $ C()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
00018无效*的memcpy(void *的DST,常量无效* SRC,为size_t LEN)
00019 {
00020为size_t我;
00021
00022 / *
00023 *的memcpy不支持重叠的缓冲区,所以总是做
00024 *前锋。 (不调整memmove与不要改变这一点。)
00025 *
00026 *对于快速复制,优化常见情况下两个指针
00027 *和长度是字对齐的,和复制字在一次一代替
00028 *字节在-A-时间。否则,复制的字节。
00029 *
00030 *下对准逻辑应该是可移植。我们依靠
00031 *编译器是相当聪明的有关优化
00032 *的分歧和模数出来。幸运的是,它是。
00033 * /
00034
00035 IF((uintptr_t形式)DST%的sizeof(长)== 0安培;&安培;
00036(uintptr_t形式)SRC%的sizeof(长)== 0安培;&安培;
00037 len个的sizeof%(长)== 0){
00038
00039长* D = DST;
00040常量长* S = SRC;
00041
00042为(i = 0; I< LEN /的sizeof(长);我++){
00043 D [i] = S [I]
00044}
00045}
00046其他{
00047的char * D = DST;
00048为const char * S = SRC;
00049
00050为(i = 0; I< LEN,我++){
00051 D [i] = S [I]
00052}
00053}
00054
00055 DST的回报;
00056}
我只是通过的memcpy
的实施下去,以了解它使用一个循环的区别。但我看不出使用一个循环而不是的memcpy
,因为的memcpy
再利用循环内部复制任何区别
我不知道他们在整数&MDASH做如果
部分; I< LEN /的sizeof(长)
。为什么需要这种计算?
解决方案
Because they are copying words, not individual bytes, in this case (as the comment says, it is an optimization - it requires less iterations and the CPU can handle word aligned data more efficiently).
len
is the number of bytes to copy, and sizeof(long)
is the size of a single word, so the number of elements to copy (means, loop iterations to execute) is len / sizeof(long)
.
这篇关于了解的memcpy源$ C $ C()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!