﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-若只如初见</title><link>http://www.cppblog.com/clane/</link><description /><language>zh-cn</language><lastBuildDate>Tue, 07 Apr 2026 19:05:56 GMT</lastBuildDate><pubDate>Tue, 07 Apr 2026 19:05:56 GMT</pubDate><ttl>60</ttl><item><title>VC 单步调试(StepInto)的一个小技巧</title><link>http://www.cppblog.com/clane/archive/2010/03/21/110206.html</link><dc:creator>clane</dc:creator><author>clane</author><pubDate>Sun, 21 Mar 2010 07:24:00 GMT</pubDate><guid>http://www.cppblog.com/clane/archive/2010/03/21/110206.html</guid><wfw:comment>http://www.cppblog.com/clane/comments/110206.html</wfw:comment><comments>http://www.cppblog.com/clane/archive/2010/03/21/110206.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/clane/comments/commentRss/110206.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/clane/services/trackbacks/110206.html</trackback:ping><description><![CDATA[&nbsp; 相对于Java之类的语言，缺少库一直是C++最为诟病的一个部分。STL、Boost等库的出现，在一定程度上弥补了这些缺憾。但这些库带来便利性的同时，也在调试代码时带来相当的不便。<br>&nbsp; 举个例子，看下面一段代码:<br>&nbsp; <br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;FooObj<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;lower(</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;c){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;</span><span style="color: #000000;">|=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0x20</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;c;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>};<br><br></span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;s</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">Ok</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br>shared_ptr</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">FooObj</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;ptr(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;FooObj);<br>s[</span><span style="color: #000000;">0</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">ptr</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">lower(s[</span><span style="color: #000000;">0</span><span style="color: #000000;">]);</span></div>
&nbsp; 在<span style="color: #000000;">s[</span><span style="color: #000000;">0</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">ptr</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">lower(s[</span><span style="color: #000000;">0</span><span style="color: #000000;">]); 这一行下断点，想F11 StepInto进入lower函数调试，却不得不先进入std::basic_string的[],然后再进入boost::shared_ptr,最后才真正进入我们想要调试的lower函数。这是相当的烦人。<br>&nbsp; 虽然可以在调试时，使用右键菜单中的Step Into Specific直接进入lower函数，但也很繁琐。<br><img alt="" src="http://www.cppblog.com/images/cppblog_com/clane/1.png" height="106" width="585"><br><br>&nbsp; 我们可以在注册表中设置来避免vc 单步调试进入某些函数。具体的位置在:<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\</span><span style="color: #000000;">9.0</span><span style="color: #000000;">\NativeDE\StepOver</span></div>
&nbsp; 其中vc2008是9.0,如果用的是其他版本的vc，则改成相应的版本号。在这个key下面新建两个字符串:<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">"</span><span style="color: #000000;">boost</span><span style="color: #000000;">"</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">boost\\:\\:.*=NoStepInto</span><span style="color: #000000;">"</span><span style="color: #000000;"><br></span><span style="color: #000000;">"</span><span style="color: #000000;">std</span><span style="color: #000000;">"</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">std\\:\\:basic_string.*=NoStepInto</span><span style="color: #000000;">"</span></div>
&nbsp; 其中字符串值的含义:funcname=action，funcname是函数的名字，用正则表达式匹配, action则是执行的动作，可以是NoStepInto</span><code><span class="typ"><span style="font-family: sans-serif;">或者</span>StepInto</span></code><span style="color: #000000;">(当action是NoStepInto时，可以省略)。</span><span style="color: #000000;">NoStepInto</span><code><span class="typ"><span style="font-family: sans-serif;">，</span></span></code><span style="color: #000000;">表示当遇到这个名字的函数时，单步调试不会进入到函数内部。注意的是，函数必须是包含命名空间的原始名字。就是说，它并不能匹配typedef内容。string是std命名空间中的一个basic_string,那么字符串值必须是basic_string,而不能是string。<br>&nbsp; 这是我的</span><span style="color: #000000;"><span style="color: #000000;">HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\</span><span style="color: #000000;">9.0</span><span style="color: #000000;">\NativeDE\StepOver下的内容:<br><img alt="" src="http://www.cppblog.com/images/cppblog_com/clane/2.png" height="249" width="602"><br></span></span><span style="color: #000000;"><br>&nbsp; Ok,现在完美了，在</span><span style="color: #000000;">s[</span><span style="color: #000000;">0</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">ptr</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">lower(s[</span><span style="color: #000000;">0</span><span style="color: #000000;">])这一行，按F11，进入的是我们想进入的lower函数，而不是stl或者boost中的内容。另一方面当我们偶然想跟入库函数，也可以使用Step Into Specific来达到目的。<br></span><img src ="http://www.cppblog.com/clane/aggbug/110206.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/clane/" target="_blank">clane</a> 2010-03-21 15:24 <a href="http://www.cppblog.com/clane/archive/2010/03/21/110206.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>vc2008 fstream不支持中文路径的解决方案</title><link>http://www.cppblog.com/clane/archive/2010/03/10/109382.html</link><dc:creator>clane</dc:creator><author>clane</author><pubDate>Wed, 10 Mar 2010 11:19:00 GMT</pubDate><guid>http://www.cppblog.com/clane/archive/2010/03/10/109382.html</guid><wfw:comment>http://www.cppblog.com/clane/comments/109382.html</wfw:comment><comments>http://www.cppblog.com/clane/archive/2010/03/10/109382.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/clane/comments/commentRss/109382.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/clane/services/trackbacks/109382.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 项目编译后给朋友试运行，发现运行出错，提示路径不正确找不到配置文件。因为朋友是放在桌面运行的，于是推测是中文路径的问题（因为路径中包含"桌面"两个汉字)。反应很诧异，什么年代了，还有中文路径的问题...<br>&nbsp;&nbsp;&nbsp;&nbsp; 跟踪了一下ifstream的open函数，发现ifstream在打开文件之前会通过_mbstowcs_l_helper函数把文件路径从mutilbyte转换到unicode。其中的关键转换函数如下:<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(_loc_update.GetLocaleT()</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">locinfo</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">lc_handle[LC_CTYPE]&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;_CLOCALEHANDLE)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;C&nbsp;locale:&nbsp;easy&nbsp;and&nbsp;fast&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(count&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;n)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">pwcs&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(wchar_t)&nbsp;((unsigned&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">)s[count]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">!</span><span style="color: #000000;">s[count])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;count;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pwcs</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;count;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></div>
&nbsp;&nbsp;&nbsp; 而vc的默认local信息就是<span style="color: #000000;">_CLOCALEHANDLE,于是中文字符很悲剧的被转换成了</span>莫名其妙的一串东西。google了下，似乎很多人碰到了这个问题，也没有特别好的解决方案，要不直接unicode,要不每次调用fstream前后都调用一遍setlocal，对代码的侵入性都很强。<br>&nbsp;&nbsp;&nbsp; 我做了个封装的解决方案，使用个模板类对fstream做一个wrapper，代码如下:<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">template</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;fstream_fix<br>&nbsp;&nbsp;&nbsp;&nbsp;:</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;T<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;fstream_fix(){};<br><br>&nbsp;&nbsp;&nbsp;&nbsp;template</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;T1</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;fstream_fix(T1&nbsp;v1){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setlocale(LC_CTYPE,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">.936</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T::open(v1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setlocale(LC_CTYPE,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;template</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;T1,</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;T2</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;fstream_fix(T1&nbsp;v1,T2&nbsp;v2){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setlocale(LC_CTYPE,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">.936</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T::open(v1,v2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setlocale(LC_CTYPE,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;template</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;T1</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;open(T1&nbsp;v1){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setlocale(LC_CTYPE,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">.936</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T::open(v1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setlocale(LC_CTYPE,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;template</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;T1,</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;T2</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;open(T1&nbsp;v1,T2&nbsp;v2){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setlocale(LC_CTYPE,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">.936</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T::open(v1,v2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setlocale(LC_CTYPE,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>};<br><br>#define ifstream fstream_fix&lt;ifstream&gt;<br>#define ofstream fstream_fix&lt;ofstream&gt;</span><span style="color: #000000;"></span></div>
&nbsp;&nbsp;&nbsp; OK.完美，对原项目没有任何影响，ifstream fi(filepath);filepath中含有中文也能正常工作了。:) 当然要注意的是，在宏定义之后，就不能再include &lt;fstream&gt;，不然可能会有编译错误。<br><br><br><br><img src ="http://www.cppblog.com/clane/aggbug/109382.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/clane/" target="_blank">clane</a> 2010-03-10 19:19 <a href="http://www.cppblog.com/clane/archive/2010/03/10/109382.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IncrediBuild 30天试用过期破解清零工具</title><link>http://www.cppblog.com/clane/archive/2010/03/09/109296.html</link><dc:creator>clane</dc:creator><author>clane</author><pubDate>Tue, 09 Mar 2010 08:40:00 GMT</pubDate><guid>http://www.cppblog.com/clane/archive/2010/03/09/109296.html</guid><wfw:comment>http://www.cppblog.com/clane/comments/109296.html</wfw:comment><comments>http://www.cppblog.com/clane/archive/2010/03/09/109296.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/clane/comments/commentRss/109296.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/clane/services/trackbacks/109296.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; IncrediBuild是一个协同编译工具，对于大型vc项目来说，几乎是一个必备品。废话不多说，基本上有几台电脑装了IncrediBuild,编译速度就是原来的几倍，很强很暴力。<br>&nbsp;&nbsp;&nbsp; IncrediBuild有30天的试用期限，到期后就不能使用。很久以前做过一个时间清零工具，有需要的同学可以下载试用。当然如果是公司用户，建议还是说服部门主管去买一套，绝对物有所值。<br>&nbsp;&nbsp;&nbsp; 执行Clear的时候，会搜索整个注册表，速度有点慢，特别是电脑差的同学，不要以为是crash了，耐心等等就好。:)第一次执行之后会在目录下生成一个key.txt,以后每次打开程序，就会自动清零时间，而不用执行Clear。<br><br>PS:安装新版本的IncrediBuild后，需要重新执行Clear，搜索整个注册表。<br><br>下载地址:<a href="http://www.cppblog.com/Files/clane/xbuildcrack.zip">http://www.cppblog.com/Files/clane/xbuildcrack.zip</a><br><br><img src ="http://www.cppblog.com/clane/aggbug/109296.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/clane/" target="_blank">clane</a> 2010-03-09 16:40 <a href="http://www.cppblog.com/clane/archive/2010/03/09/109296.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>vc编译期的常量除法优化</title><link>http://www.cppblog.com/clane/archive/2009/02/23/74636.html</link><dc:creator>clane</dc:creator><author>clane</author><pubDate>Sun, 22 Feb 2009 16:16:00 GMT</pubDate><guid>http://www.cppblog.com/clane/archive/2009/02/23/74636.html</guid><wfw:comment>http://www.cppblog.com/clane/comments/74636.html</wfw:comment><comments>http://www.cppblog.com/clane/archive/2009/02/23/74636.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/clane/comments/commentRss/74636.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/clane/services/trackbacks/74636.html</trackback:ping><description><![CDATA[在vc release模式下调试时，经常可以看到下面形式的汇编代码:<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">00FB1202&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ecx,dword&nbsp;ptr&nbsp;ds:[00FB543Ch]&nbsp;<br>00FB1208&nbsp;&nbsp;sub&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ecx,dword&nbsp;ptr&nbsp;ds:[00FB5438h]&nbsp;<br>00FB120E&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,66666667h&nbsp;<br>00FB1213&nbsp;&nbsp;imul&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ecx&nbsp;&nbsp;<br>00FB1215&nbsp;&nbsp;sar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;edx,</span><span style="color: #000000;">5</span><span style="color: #000000;">&nbsp;<br>00FB1218&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ecx,edx&nbsp;<br>00FB121A&nbsp;&nbsp;shr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ecx,1Fh&nbsp;<br>00FB121D&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ecx,edx&nbsp;</span></div>
其实这是当被除数是常量时除法的编译器优化。x<span style="color: #000000;">/50h<br></span><span style="color: #000000;">优化方法是把除法转换成乘以被除数然后右移.<br>x/y =&gt;&nbsp; x*(1 /y) =&gt;&nbsp; x* ((1&lt;&lt;37) /((1&lt;&lt;37)* y) ) =&gt;x * ((1&lt;&lt;37)/ y)&gt;&gt;37<br>为了取整效果，最终结果将会是</span><span style="color: #000000;">x/y = x * ((1&lt;&lt;37 +y-1 )/ y)&gt;&gt;37</span><br><span style="color: #000000;">由于y 是常量，在编译期，编译器就可以计算出</span><span style="color: #000000;">((1&lt;&lt;37 +y-1 )/ y)</span><span style="color: #000000;">的值。<br>那么实际计算时，编译期就可以把 x/y 转换成 x *M &gt;&gt; 37, M = </span><span style="color: #000000;">((1&lt;&lt;37 +y-1 )/ y)<br>除以0x50 M = (1&lt;&lt;37 + 0x4F)/0x50 = 0x</span><span style="color: #000000;">66666667<br>那么x / 0x50相当于 (x* </span><span style="color: #000000;">0x</span><span style="color: #000000;">66666667)&gt;&gt;37<br><br></span><img src ="http://www.cppblog.com/clane/aggbug/74636.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/clane/" target="_blank">clane</a> 2009-02-23 00:16 <a href="http://www.cppblog.com/clane/archive/2009/02/23/74636.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>luabind的converter和policy</title><link>http://www.cppblog.com/clane/archive/2009/01/08/71511.html</link><dc:creator>clane</dc:creator><author>clane</author><pubDate>Thu, 08 Jan 2009 09:10:00 GMT</pubDate><guid>http://www.cppblog.com/clane/archive/2009/01/08/71511.html</guid><wfw:comment>http://www.cppblog.com/clane/comments/71511.html</wfw:comment><comments>http://www.cppblog.com/clane/archive/2009/01/08/71511.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/clane/comments/commentRss/71511.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/clane/services/trackbacks/71511.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;现在的C++设计，为了保证健壮性和复用性，特别是GP的流行，往往应用了大量的模板，容器，智能指针。但这对与LUA绑定来说绝对不是一个好消息，非常的烦琐。个人觉得，在第三方的绑定库里面，luabind和现代C++设计结合最好，也是灵活性最高的一个绑定库。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lu...&nbsp;&nbsp;<a href='http://www.cppblog.com/clane/archive/2009/01/08/71511.html'>阅读全文</a><img src ="http://www.cppblog.com/clane/aggbug/71511.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/clane/" target="_blank">clane</a> 2009-01-08 17:10 <a href="http://www.cppblog.com/clane/archive/2009/01/08/71511.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>