[问题]c++里头的内存复制问题

苦逼热狗

路边通讯社社长
VIP
注册
2002-10-12
消息
47,114
荣誉分数
2,376
声望点数
393
memcpy,RtlCopyMemory
rtlcopymemory是不错,至少比memcpy快
我想知道有没有比rtlcopymemory更快的?

或者我们写一个自己的memorycpy不知道会不会好点
代码:
inline void opt_memcpy(BYTE* dest, const BYTE* src, int len)
{
	int i;
	i = 0;
	while(i<len)
	{
		*dest = *src;
		i++;
		dest++;
		src++;
	}
}
//less code
inline void opt_memcpy(BYTE* dest, const BYTE* src, int len)
{
while (len--)
(*dest++)=(*src++);
}
 
代码:
//RtlCopyMemory
0040375E  |.  8B33          |MOV ESI,DWORD PTR DS:[EBX]
00403760  |.  8BD1          |MOV EDX,ECX
00403762  |.  C1E9 02       |SHR ECX,2
00403765  |.  F3:A5         |REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
00403767  |.  8BCA          |MOV ECX,EDX
00403769  |.  8B5424 20     |MOV EDX,DWORD PTR SS:[ESP+20]
0040376D  |.  83E1 03       |AND ECX,3
00403770  |.  F3:A4         |REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
00403772  |.  8BF8          |MOV EDI,EAX

//opt_memcpy
0040375E  |.  8B0F          |MOV ECX,DWORD PTR DS:[EDI]
00403760  |.  85C0          |TEST EAX,EAX
00403762  |.  7E 15         |JLE SHORT 00403779
00403764  |.  894424 24     |MOV DWORD PTR SS:[ESP+24],EAX
00403768  |>  8A01          |/MOV AL,BYTE PTR DS:[ECX]
0040376A  |.  8806          ||MOV BYTE PTR DS:[ESI],AL
0040376C  |.  8B4424 24     ||MOV EAX,DWORD PTR SS:[ESP+24]
00403770  |.  46            ||INC ESI
00403771  |.  41            ||INC ECX
00403772  |.  48            ||DEC EAX
00403773  |.  894424 24     ||MOV DWORD PTR SS:[ESP+24],EAX
00403777  |.^ 75 EF         |\JNZ SHORT 00403768
00403779  |>  8BF3          |MOV ESI,EBX
 
不一定代码少就快,一般会优化的在库里,往上有的是。
 
楼上说得对,能用库就尽量用库。
byte 2 byte copy 肯定不是最快的,应该是先做block copy then copy remaining。
 
后退
顶部