sec*_*lsh 5 c++ arrays assembly machine-instruction
我在C++中将元素从一个数组复制到另一个数组.我发现rep movsx86中的指令似乎将ESI处的数组复制到大小为ECX的EDI的数组.但是,我尝试的fornor while循环都没有编译成rep movsVS 2008中的指令(在Intel Xeon x64处理器上).如何编写将编译为此指令的代码?
Cra*_*rks 11
老实说,你不应该.REP在指令集中是一种过时的保持,实际上非常慢,因为它必须调用CPU内部的微编码子程序,它具有ROM查找延迟并且也是非流水线的.
在几乎每个实现中,您都会发现memcpy()编译器内在函数更易于使用并且运行速度更快.
在MSVC下,有__movsxxx&__stosxxxintrinsics将生成一个REP前缀指令.
由于crt中的sse2分支,还有一个'hack'强制内在memsetaka REP STOSvc9 +,因为内在不再退出.这是更好的,__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);
}
Run Code Online (Sandbox Code Playgroud)
当然REP并非总是用最好的东西,你的IMO方式最好不要使用memcpy,它会跳转到任何SSE2或REPS MOV根据您的系统上(下MSVC),除非你的感觉就像编写自定义组件的"火热"区域.. .
| 归档时间: |
|
| 查看次数: |
3685 次 |
| 最近记录: |