c – 使用movsd制作编译器复制字符

前端之家收集整理的这篇文章主要介绍了c – 使用movsd制作编译器复制字符前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想在时间关键函数中复制相对较短的内存序列(小于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++ – >优化?

当然,我假设也启用了其他优化.

猜你在找的C&C++相关文章