我正在将一个数组复制到C ++中的另一个数组。我找到了 rep movs X86中的指令似乎将ESI的数组复制到EDI的数数尺寸ECX。但是,都不 for 也不 while 循环我尝试编译为 rep movs VS 2008中的指令(在Intel Xeon X64处理器上)。如何编写将被编译到此说明的代码?

有帮助吗?

解决方案

如果您完全需要该指令 - 使用内置汇编程序并手动编写该指令。 您不能依靠编译器生成任何特定的机器代码 - 即使它在一个汇编中发出,它也可以决定在下一次汇编期间发出其他等效物。

其他提示

老实说,你不应该。 REP是指令集中的一个过时的保留,实际上非常慢,因为它必须在CPU内调用微编码子例程,该子例程具有ROM查找延迟,并且也不列入。

在几乎每个实施中,您都会发现 memcpy() 编译器的内在既易于使用又更快地运行。

在MSVC下,有 __movsxxx & __stosxxx 会产生一个的内在信息 REP 前缀指令。

还有一个“黑客”来强制固有的 memset 又名 REP STOS 在VC9+下,由于CRT中的SSE2分支,由于固有的不再退出。更好的是 __stosxxx 由于事实,编译器可以为常量进行优化并正确订购。

#define memset(mem,fill,size) memset((DWORD*)mem,((fill) << 24|(fill) << 16|(fill) << 8|(fill)),size)
__forceinline void memset(DWORD* pStart, unsigned long dwFill, size_t nSize)
{
    //credits to Nepharius for finding this
    DWORD* pLast = pStart + (nSize >> 2);
    while(pStart < pLast)
        *pStart++ = dwFill;

    if((nSize &= 3) == 0)
        return;

    if(nSize == 3)
    {
        (((WORD*)pStart))[0]   = WORD(dwFill);
        (((BYTE*)pStart))[2]   = BYTE(dwFill);
    }
    else if(nSize == 2)
        (((WORD*)pStart))[0]   = WORD(dwFill);
    else
        (((BYTE*)pStart))[0]   = BYTE(dwFill);
}

当然 REP 并不总是最好的使用,IMO更好地使用 memcpy, ,它将分支到SSE2或 REPS MOV 基于您的系统(在MSVC下),除非您想为“热”区域编写定制组件...

代表和朋友曾经很高兴,X86 CPU是一位单双皮亚工业CISC处理器。

但这已经改变。如今处理器遇到 任何 指令,它的第一个是将其转换为更易于的格式(类似于VLIW的微型OPS),并将其安排为将来执行(这是订购外执行的一部分,是不同逻辑CPU内核之间计划的一部分,IT可以用来将写入后写入序列简化为单写的ET.C.)。该机器可用于转换一些类似VLIW的Opcodes但不能转换为循环的机器代码。循环翻译的机器代码可能会导致执行管道失速。

他们没有花费数十万个晶体管来构建CPU电路来处理执行管道中的微型副操作的循环部分,而只是用某种cr脚的旧模式来处理它,使该管道停滞不前,并要求现代程序员停滞不前写自己的该死的循环!

因此,当机器编写代码时很少使用。如果您在二进制可执行文件中遇到代表,那么它可能是一个不了解的人类组装仪,或者是一个真正需要保存的少数字节而不是实际的循环的饼干。

(但是。把我刚刚用盐的所有东西拿走。也许这已经不再是真的。我不再100%与X86 CPU的内部最新,我陷入了其他爱好。

我使用cmps*,movs*,scas*和stos*指令变体的rep*前缀变体来生成最小化代码大小的内联代码,避免了不必要的呼叫/跳跃,从而降低了卡切斯的工作。替代方法是设置参数并在其他地方调用MEMSET或MEMCPY,如果我想复制一百个字节或更多,则总体上可能会更快,但是如果仅使用REP的10-20字节,或者至少是10-20个字节(或者至少是)我最后一次测量)。

由于我的编译器允许在优化活动中规范和使用内联装配功能,并将其寄存器使用/修改包括在内,因此在情况正确时,我可以使用它们。

从历史性的角度来看 - 对制造商的策略没有任何了解 - 曾经有一段时间“ Rep Movs*”(ETC)的说明非常慢。我认为这是奔腾/奔腾MMX的时间。我的一位同事(比我有更多的见识)说,制造商已经降低了分配给代表处理的芯片区域(<=>较少的晶体管/更多微码),并将其用于使其他使用的指令更快。

在左右的十五年左右的时间里,销售代表再次相对更快,这将暗示更多的晶体管/更少的微码。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top