﻿<?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++博客-Small place</title><link>http://www.cppblog.com/fenglinuestc/</link><description>Things will not always be bad,enjoy it.</description><language>zh-cn</language><lastBuildDate>Tue, 07 Apr 2026 16:08:48 GMT</lastBuildDate><pubDate>Tue, 07 Apr 2026 16:08:48 GMT</pubDate><ttl>60</ttl><item><title>C运行时对debug和release的影响</title><link>http://www.cppblog.com/fenglinuestc/archive/2008/05/06/49038.html</link><dc:creator>Lexili</dc:creator><author>Lexili</author><pubDate>Tue, 06 May 2008 12:06:00 GMT</pubDate><guid>http://www.cppblog.com/fenglinuestc/archive/2008/05/06/49038.html</guid><wfw:comment>http://www.cppblog.com/fenglinuestc/comments/49038.html</wfw:comment><comments>http://www.cppblog.com/fenglinuestc/archive/2008/05/06/49038.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/fenglinuestc/comments/commentRss/49038.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/fenglinuestc/services/trackbacks/49038.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>这几天想提高一下自己的</span><span>debug</span><span>水平，于是看了下熊力写的那那个《</span><span>windows</span><span>用户态程序高效排错》，里边有个比较有趣的问题，下边的程序的</span><span>debug</span><span>版本比</span><span>release</span><span>的版本要快，为什么？</span><span>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;nSize</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">200</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pSource</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)malloc(nSize</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(pSource</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">NULL)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pDest</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)malloc(nSize</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(pDest</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">NULL)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;memset(pSource,</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">a</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,nSize);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;pSource[nSize]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">\0</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwStart</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">GetTickCount();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">5000000</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_309_345_Open_Image onclick="this.style.display='none'; Codehighlighter1_309_345_Open_Text.style.display='none'; Codehighlighter1_309_345_Closed_Image.style.display='inline'; Codehighlighter1_309_345_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_309_345_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_309_345_Closed_Text.style.display='none'; Codehighlighter1_309_345_Open_Image.style.display='inline'; Codehighlighter1_309_345_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_309_345_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_309_345_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcpy(pDest,pSource);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwend</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">GetTickCount();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,dwend</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">dwStart);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<p></span><span>&nbsp;&nbsp;&nbsp;&nbsp; 当然对于我这种小菜肯定是不容易懂清楚的了，于是找了很多资料，才发现原来跟</span><span>debug</span><span>和</span><span>release</span><span>下</span><span>strcpy</span><span>的函数类型有关的，前者是内联函数</span><span>(inline),</span><span>而后者是直接调用运行时库的（这个在</span><span>IDA</span><span>中可以清楚的看到），于是这</span><span>5000000</span><span>次的调用的差距就体现出来了</span><span>.<br>&nbsp;&nbsp;&nbsp;&nbsp; </span><span>但是为什么同一个编译器出来的执行文件出来的函数会有不同的类型呢</span><span>?</span><span>这就要扯到</span><span>C</span><span>运行时库上边了</span><span>--</span><span>Windows</span><span>环境下，</span><span>VC</span><span>提供的</span><span> C run-time library</span><span>分为动态运行时库和静态运行时库。动态运行时库主要是</span><span>DLL</span><span>库文件</span><span>msvcrt.dll(or MSVCRTD.DLL for debug build),</span><span>对应的</span><span>Import library</span><span>文件是</span><span>MSVCRT.LIB(MSVCRTD.LIB for debug build),</span><span>而静态运行时库</span><span>(release</span><span>版</span><span>)</span><span>对应的主要文件是：</span><span>LIBC.LIB (Single thread static library, retail version),LIBCMT.LIB (Multithread static library, retail version).</span><span>由于这些运行时库的实现者不同</span><span>,</span><span>所实现的函数也就不同了</span><span>,</span><span>而对于这个有趣的问题我们可以看到在</span><span>MSVCRT.LIB</span><span>中</span><span>strcpy</span><span>是内联函数</span><span>,</span><span>而</span><span>LIBC.LIB</span><span>或</span><span>LIBCMT.LIB</span><span>中的不是了</span><span>.<br></span><span>C</span><span>运行时库的相关文章在这</span><span>:http://www.cppblog.com/aqazero/archive/2007/09/21/14173.html</span></p>
<img src ="http://www.cppblog.com/fenglinuestc/aggbug/49038.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/fenglinuestc/" target="_blank">Lexili</a> 2008-05-06 20:06 <a href="http://www.cppblog.com/fenglinuestc/archive/2008/05/06/49038.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>