我想在时间关键的函数中复制相对较短的内存序列(小于 1 KB,通常为 2-200 字节)。 CPU 端的最佳代码似乎是rep movsd
。但是我不知何故无法让我的编译器生成此代码。我希望(我隐约记得看到过)使用 memcpy 可以使用编译器内置的内在函数来完成此操作,但基于反汇编和调试,编译器似乎正在使用对 memcpy/memmove 库实现的调用来代替。我还希望编译器足够聪明,能够识别以下循环并使用rep movsd
就其本身而言,但似乎并非如此。
char *dst;
const char *src;
// ...
for (int r=size; --r>=0; ) *dst++ = *src++;
有没有办法让Visual Studio编译器生成rep movsd
除了使用内联汇编之外的顺序?
我想到了几个问题。
首先,你怎么知道 movsd 会更快?您查看过它的延迟/吞吐量吗? x86 架构充满了不应该使用的旧指令,因为它们在现代 CPU 上效率不高。
其次,如果你使用会发生什么std::copy
而不是 memcpy?std::copy
可能更快,因为它可以在编译时针对特定数据类型进行专门化。
第三,您是否在项目属性 -> C/C++ -> 优化下启用了内部函数?
当然,我假设还启用了其他优化。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)