假设我想复制# no号。从一个数组到另一个数组的整数。我发现以下3项的性能是不同的,尽管它们完成了相同的任务:
memcpy((char*)(arr), (char*)(temp), sizeof(int) * size);
memcpy((int*)(arr), (int*)(temp), size);
memcpy((double*)(arr), (double*)(temp), size/(sizeof(double)/sizeof(int)));计时时间分别为160、40和20 (1百万整数)。我知道在每种情况下寄存器的使用都是不同大小的,但是我期望MSVC编译器使用最高(向量)寄存器大小来优化所有这些。内存对齐可以通过创建剥离循环和剩余循环来实现。此外,还有可能使用非时态/流存储。在编译器中有强制这种优化的方法吗?
另外,在MSVC中有什么办法强制备忘录内衬吗?
发布于 2020-08-24 14:00:39
memcpy总是复制字节,而您似乎认为它复制了您传递的类型(int或double)。来自优先选择
将字节从src指向的对象复制到dest指向的对象。这两个对象都被重新解释为无符号字符数组。
由于您的三个调用确实复制了不同数量的字节,因此运行时的差异是预期的。如果sizeof(int) == 4和double是平台上int大小的两倍,则所测量的时间是一致的。
发布于 2020-08-24 13:59:16
即使他们完成了同样的任务
不,那不是真的。
memcpy的最后一个参数是长度,以字节()为单位的,而不是项目数。你的第二行的工作量少了四倍,只复制了你想要的四分之一(或者第一行拷贝了四倍)。
发布于 2020-08-24 14:11:42
其他答案很好地解释了这个问题,我只想补充一些数字来澄清:
memcpy((char*)(arr), (char*)(temp), sizeof(int) * size);第一个调用复制可能是4 * size 字节的sizeof(int) * size字节。它需要160微秒。
memcpy((int*)(arr), (int*)(temp), size);第二个调用复制size 字节,因此可以减少4倍的时间,也可以节省4倍的时间,即160/4 = 40微秒。
memcpy((double*)(arr), (double*)(temp), size/(sizeof(double)/sizeof(int)));第三个调用复制size/(sizeof(double)/sizeof(int))字节(很可能是size/(8/4) ),因此复制字节。这比第一和第二种情况分别少8倍和2倍。它需要160/8 = 40/2 = 20微秒。
因此,运行时与复制的字节数成正比。
https://stackoverflow.com/questions/63562504
复制相似问题