memcpy是不是最快的?
一般什么样的拷贝方式最快?
一般什么样的拷贝方式最快?
解决方案 »
- CEDIT如何获取当前窗口大小下最多能容纳多少字符?
- 怎么引用其他类的函数
- 请教有关托管c++代码和非托管c++代码的混合编程的问题。
- 求助:基于内容的图像检索
- 高手帮帮忙:远程控制中鼠标双击的问题。
- 如何在vc中实现将图片存储到Sql Server的Image类型的字段中
- 高分请教-----用什么实现FTP服务器
- 我把另一个程序的文档拿到另一个中,结果文档就不处理消息了,不知道为什么,好久都没有解决问题。100分求助。
- 在线等待---sdk编程,如何将菜单加在窗口上,
- windows为什么要引入主窗口?
- vc下使用ADO访问access数据库是否无法采用批处理更新?
- 关于socket聊天程序的若干问题,大家帮顶,多多发言!!!!!
可以写个测试代码看一下啊
是内存的速度?CPU的速度?总线带宽?I/O?有没有人能系统地介绍一下?
{
memcpy(d,s,1);
}选性能最优化,生成汇编代码可以看到。代码被优化成:mov eax, DWORD PTR _s$[esp-4]
mov edx, DWORD PTR _d$[esp-4]
mov cl, BYTE PTR [eax]
mov BYTE PTR [edx], cl只是一个字节拷贝,用 cl 寄存器 mov 完成的。把 1 改成 4 后:mov eax, DWORD PTR _s$[esp-4]
mov edx, DWORD PTR _d$[esp-4]
mov ecx, DWORD PTR [eax]
mov DWORD PTR [edx], ecx就变成了一条最普通的 mov 指令。如果是 8 个字节:mov eax, DWORD PTR _s$[esp-4]
mov ecx, DWORD PTR _d$[esp-4]
mov edx, DWORD PTR [eax]
mov DWORD PTR [ecx], edx
mov eax, DWORD PTR [eax+4]
mov DWORD PTR [ecx+4], eax就是两条 mov 指令。直到长度是常量 19 还是用 mov 完成的:mov eax, DWORD PTR _s$[esp-4]
mov ecx, DWORD PTR _d$[esp-4]
mov edx, DWORD PTR [eax]
mov DWORD PTR [ecx], edx
mov edx, DWORD PTR [eax+4]
mov DWORD PTR [ecx+4], edx
mov edx, DWORD PTR [eax+8]
mov DWORD PTR [ecx+8], edx
mov edx, DWORD PTR [eax+12]
mov DWORD PTR [ecx+12], edx
mov dx, WORD PTR [eax+16]
mov WORD PTR [ecx+16], dx
mov al, BYTE PTR [eax+18]
mov BYTE PTR [ecx+18], al长度达到 20 后,就转变成了使用 rep movsdpush esi
mov esi, DWORD PTR _s$[esp]
push edi
mov edi, DWORD PTR _d$[esp+4]
mov ecx, 5
rep movsd
pop edi
pop esi如果长度并非 4 的整数倍的话,比如复制 23 个字节:push esi
mov esi, DWORD PTR _s$[esp]
push edi
mov edi, DWORD PTR _d$[esp+4]
mov ecx, 5
rep movsd
movsw
movsb
pop edi
pop esi编译器会在后面插入 movsw 和 movsb 。现在我们来看看,memcpy 的长度是变量的情况:void foo(void *d,const void *s,size_t size)
{
memcpy(d,s,size);
} 这次编译器直接调用了 rep movsdmov ecx, DWORD PTR _size$[esp-4]
push esi
mov esi, DWORD PTR _s$[esp]
mov eax, ecx
push edi
mov edi, DWORD PTR _d$[esp+4]
shr ecx, 2
rep movsd
mov ecx, eax
and ecx, 3
rep movsb
pop edi
pop esi因为我们并不知道 size 是否是 4 的整数倍,所以尾巴上用 and ecx,3 / repmovsb 来处理了一下。那么我们能否通知编译器,需要 memcpy 的数据块长度是 4 的倍数呢?答案是可以的。看看编译器怎么编译 memcpy(d,s,size*4);mov ecx, DWORD PTR _size$[esp-4]
push esi
mov esi, DWORD PTR _s$[esp]
push edi
mov edi, DWORD PTR _d$[esp+4]
rep movsd
pop edi
pop esi非常简洁,不是吗?