memset()清零和直接清零哪个更快呢?

apple_pxy 2011-11-17 06:57:55
int a[100]={0};
memset(a,0,100);
...全文
1326 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2011-11-18
  • 打赏
  • 举报
回复
‘变量初始化’和‘变量赋值’不是一回事。
wjb_yd 2011-11-18
  • 打赏
  • 举报
回复
纠结这种事情,意义不大。
btloveet 2011-11-18
  • 打赏
  • 举报
回复
....蛋疼。,
lancerEx 2011-11-18
  • 打赏
  • 举报
回复
看编译器吧
shuoshuo_mt 2011-11-18
  • 打赏
  • 举报
回复
memset()
  • 打赏
  • 举报
回复
VS2008
编译选项
cl test.cpp /O2 /FAs
生成代码
; 9    : 	int a[100] = {0};

push 396 ; 0000018cH
lea eax, DWORD PTR _a$[esp+416]
push 0
push eax
mov DWORD PTR _a$[esp+420], 0
call _memset

; 10 : memset( a, 0, 100 );

push 100 ; 00000064H
lea ecx, DWORD PTR _a$[esp+424]
push 0
push ecx
call _memset
majia2011 2011-11-18
  • 打赏
  • 举报
回复
如果想提高效率,自己写个memset,是要用汇编写的。

7楼是正解,至于64位和32位问题,自己注意一下吧
jixiang1983 2011-11-18
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 anyidan 的回复:]
int a[100]={0};虽然快,但只能用于初始化
[/Quote]
9楼说的是,第一种方式只能用在数组定义时初始化,程序中可能需要多处使用一个数组并对其清零,这样用memset就很方便了。
gaochizhen33 2011-11-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 luotuo44 的回复:]
第一种快。
下面是VC6.0环境下 对应的汇编代码
13: int a[100] = {0};
0040D44E mov dword ptr [ebp-1A0h],0
0040D458 mov ecx,63h
0040D45D xor eax,eax
0040D45F lea edi,[ebp-19Ch]
0040D465 rep stos dword ptr [edi]
14: ……
[/Quote]
++
zhoujiawen 2011-11-18
  • 打赏
  • 举报
回复
需要精确抢时间到这个地步啊
AnYidan 2011-11-17
  • 打赏
  • 举报
回复
int a[100]={0};虽然快,但只能用于初始化
iamnobody 2011-11-17
  • 打赏
  • 举报
回复
int a[100]={0};//肯定是这个更快或者一样快,你说编译器的作者会不会傻到实现这个功能用一个比不上memset(a,0,100*sizeof(int));的方法,你要相信他们还是有点IQ的,就算没想出好方法,也会直接调用memset(),难道还会故意写一个比memset()慢而且又是实现相同功能的方法吗?
memset(a,0,100); //应该改成:memset(a,0,100*sizeof(int));否则这个memset()肯定更快了
柯本 2011-11-17
  • 打赏
  • 举报
回复
这个要看编译器.如CB的

; int a[100]={0};
;
mov esi,offset $emgndaia
lea edi,dword ptr [ebp-436]
mov ecx,100
rep movsd



;[]-----------------------------------------------------------------[]
;| MEMSET.ASM -- sets memory to value |
;[]-----------------------------------------------------------------[]

;
; C/C++ Run Time Library - Version 11.0
;
; Copyright (c) 1991, 2002 by Borland Software Corporation
; All Rights Reserved.
;

; $Revision: 9.4.2.1 $

include RULES.ASI

; Segments Definitions

Header@

;-----------------------------------------------------------------------
;
;Name memset - sets memory to value
;
;Usage void *memset(void *src, int c, size_t n);
;
;Prototype in mem.h
;
;Description sets the n bytes of the block pointed to by src to
; c. This implementation has been optimized for the
; Pentium processor.
;
;Return value src
;
;-----------------------------------------------------------------------

Code_seg@

Func@ memset, _EXPFUNC, _RTLENTRYF, <pointer src>,<int c>,<int n>

Link@ edi
mov al, c ; get byte to store

mov edx,n ; get the byte count
mov edi, src ; get src
mov ah, al
test edx, not 3 ; byte count is less than 4 ?
je lessthan4

mov [edi], ax ; u
lea ecx, [edi+edx-4]; v, point at the end of dest

mov [edi+2], ax ; u
mov eax, [edi] ; v

shr edx, 3 ; u, divide the count by 8
jz lessthan8 ; v

bigchunk:
mov [edi], eax ; 1 u
mov [edi+4], eax ; 1 v
dec edx ; 2 u
jz afterbigchunk ; 2 v

mov [edi+8], eax
mov [edi+12], eax
dec edx
jz afterbigchunk

mov [edi+16], eax
mov [edi+20], eax
dec edx
jz afterbigchunk

mov [edi+24], eax
mov [edi+28], eax
dec edx
jz afterbigchunk

mov [edi+32], eax
mov [edi+36], eax
dec edx
jz afterbigchunk

mov [edi+40], eax
mov [edi+44], eax
lea edi, [edi+48]
dec edx
jnz bigchunk

afterbigchunk:
mov [ecx], eax ; u, copy the last two dword of the buffer
mov [ecx-4], eax ; v, NB : it could be misaligned !!!
mov eax, src ; return src
Unlink@ edi
Return@


lessthan8: ; but more than 3
mov [ecx], eax
mov eax, src ; return src
Unlink@ edi
Return@

lessthan4:
and edx, 3
jz done
mov [edi], al
dec dl
jz done ; 1 byte
mov [edi+edx-1], ax
done:
mov eax, src
Unlink@ edi
Return@

EndFunc@ memset

Code_EndS@

end


不要看memset的代码很长,但它是优化了的代码,所以,从单个执行来看,memset效率更高些

实际的,可编一测试程序,看看谁的执行时间更多
一鸣惊人 2011-11-17
  • 打赏
  • 举报
回复
没研究过这个~~~ 顶个~~~~
luotuo44 2011-11-17
  • 打赏
  • 举报
回复
第一种快。
下面是VC6.0环境下 对应的汇编代码
13: int a[100] = {0};
0040D44E mov dword ptr [ebp-1A0h],0
0040D458 mov ecx,63h
0040D45D xor eax,eax
0040D45F lea edi,[ebp-19Ch]
0040D465 rep stos dword ptr [edi]
14: memset(a,0,100);
0040D467 push 64h
0040D469 push 0
0040D46B lea eax,[ebp-1A0h]
0040D471 push eax
0040D472 call memset (00409200)

从这些汇编代码可以看到第一种方法比第二种快很多很多。因为第二种得调用的memset()函数。这需要很多的机器指令。
qq120848369 2011-11-17
  • 打赏
  • 举报
回复
计算机比你想的快太多了.
duke56 2011-11-17
  • 打赏
  • 举报
回复
看什么情况,生成可执行文件时,一个是在编译把数据清零,一个是运行后清掉

至于运行后应该是不相上下的...都要指定个数和数据...地址
longxing898 2011-11-17
  • 打赏
  • 举报
回复
memset快
turing-complete 2011-11-17
  • 打赏
  • 举报
回复
前 者

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧