【发布时间】:2020-08-24 13:55:47
【问题描述】:
假设我想复制#SIZE 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 us、40 us 和 20 us(对于 100 万个整数的大小)。我知道在每种情况下使用寄存器的大小都会不同,但我期待 MSVC 编译器通过使用最高(向量)寄存器大小来优化所有这些。内存对齐可以通过创建剥离和剩余循环来实现。也有可能使用非临时/流媒体商店。有没有办法在编译器中强制进行这种优化?
另外,有没有办法在 MSVC 中强制内联 memcpy?
【问题讨论】:
-
结果提示复制的尺寸越小,经过的时间越短。
memcpy()的第二次和第三次调用不会做你想做的事情(复制size整数)。 -
memcpy 的第三个参数以字节为单位。这三个语句正在复制不同数量的内存。
-
您在前两个参数中所做的所有这些转换都是多余的。
memcpy采用void指针作为前两个参数,因此不需要强制转换。 -
另外,在任何优秀的优化编译器中使用类型安全的
std::copy将或应该归结为memcpy。也许您应该使用它而不是在很多地方进行投射。 -
谢谢大家。没有正确阅读文档并因假设而错过的愚蠢错误。我有一个测试来检查数组的端点是否完全复制但我发现我犯了一个错误并且正在检查错误的数组。
标签: c++ windows visual-c++ memcpy