注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

gmd20的个人空间

// 编程和生活

 
 
 

日志

 
 

C++ 函数静态局部变量在第一次调用函数时初始化  

2012-10-12 10:56:35|  分类: 程序设计 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

这个不记得在那个书上看到的了,确实是这样的。怕有问题,特意看了一下汇编。/

vc2008里面的,编译器会自动添加一个全局变量,用于辅助判断是不是第一进入函数,如果是就调用那些函数的静态变量的构造函数来做初始化。



不开优化版本的汇编,

status DuaeterSib::beginRequest(const XXX_handle_def* proxy, ReqCtx * context)
{

static AnyTypeHelper type_ccr(Diameter_CCR_str_,Diameter_CCR_size_);
00DD3D51 mov eax,dword ptr [$S1 (39D45C8h)] // 编译器自动添加了一个名字为 $S1全局变量用于判断是不是第一进入函数
00DD3D56 and eax,1
00DD3D59 jne DiameterSib::beginRequest+77h (0DD3D97h) //如果不是第一次进入函数,就跳过 static成员的初始化了
00DD3D5B mov eax,dword ptr [$S1 (39D45C8h)]
00DD3D60 or eax,1
00DD3D63 mov dword ptr [$S1 (39D45C8h)],eax //上面几步给 $S1 变量赋值为 1了。
00DD3D68 mov dword ptr [ebp-4],0
00DD3D6F push 14Bh
00DD3D74 push offset string "b10+d0+d0+h4+c2+b2+h1+d0+Kb2+Bh8"... (0E31560h)
00DD3D79 mov ecx,offset type_ccr (39D45A8h)
00DD3D7E call AnyTypeHelper::AnyTypeHelper (0DD3EE0h) //第一次调用函数时,初始化静态局部变量 调用静态变量的构造函数。
00DD3D83 push offset `DiameterSib::beginRequest'::`2'::`dynamic atexit destructor for 'type_ccr'' (0DFD6B0h)
00DD3D88 call atexit (0DD8203h)
00DD3D8D add esp,4
00DD3D90 mov dword ptr [ebp-4],0FFFFFFFFh
Diameter_CCR ccr;
DiameterAvps avps;
avps._type = type_ccr.PreparedCINString();
00DD3D97 mov ecx,offset type_ccr (39D45A8h) //跳到这里
00DD3D9C call AnyTypeHelper::PreparedCINString (0DD3FC0h)
00DD3DA1 mov dword ptr [ebp-2C4h],eax


  评论这张
 
阅读(971)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017