Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么memcpy()更快?_C_Memcpy - Fatal编程技术网

为什么memcpy()更快?

为什么memcpy()更快?,c,memcpy,C,Memcpy,我很好奇为什么memcpy函数比简单的手动拷贝快 这是我的密码: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> int main() { clock_t begin, end; double time_spent; int i, j; char source[65536], destination[

我很好奇为什么memcpy函数比简单的手动拷贝快

这是我的密码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

int main() 
{ 
    clock_t begin, end;
    double time_spent;
    int i, j;   
    char source[65536], destination[65536]; 

    begin = clock();

    for (j = 0; j<1000; j++) 
        for (i = 0; i < 65536; i++) destination[i] = source[i];
    //slower than memcpy(destination, source, 65536);

    end = clock();
    time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
    printf("%Lf\n",time_spent);
    system("pause");
} 
memcpy的实现不是做了同样的事情吗?
提前感谢。

memcpy可以结合其他各种优化,例如SIMD。有关详细信息,请参阅。

,因为for循环会逐个复制该项。而memcpy可以逐块复制项目。您可以在这里阅读memcpy的源代码:或者在这里

一个好的优化编译器应该确定您的循环实际上是memmove或memcpy,并用对该函数的调用来替换它。这仍然留下了一个问题:为什么这样做是明智的

事实证明,有很大的空间可以手动优化编译后的代码以复制内存,而且编译器几乎没有足够的智能来完成这一切,但它也非常特定于cpu,因此OSs将为它们支持的每个cpu系列提供专门的版本,并在运行时交换它们

以下是OSX的x86_64 SSE 4.2拷贝实现:

memcpy的实现不是做同样的事情吗

不一定

这是一个标准库函数,因此:

它可能是高度优化的,使用特定于平台的快速汇编指令,或者每次迭代只复制一个以上的字节,如果处理器有足够大的寄存器,这会更快; 编译器可能会将其识别为一个内置项,因此它可能会执行更多的优化步骤,例如,将其内联以消除函数调用开销,或者从其上下文中推断您正试图执行的操作,并使用另一种方法执行,等等。 memcpy不是一个普通的循环。有许多优化措施


对齐和单词大小等功能允许memcpy以稳定的速度复制更大的内存块。

memcpy将尝试立即复制单词,也就是说,在32位系统上每次迭代4字节,在64位系统上每次迭代8字节。

您只需进入memcpy,就可以发现它不是一个简单的循环。

编译时使用了哪些优化标志?