這幾天想提高一下自己的debug水平,于是看了下熊力寫的那那個《windows用戶態程序高效排錯》,里邊有個比較有趣的問題,下邊的程序的debug版本比release的版本要快,為什么?
int nSize=200;
char *pSource=(char *)malloc(nSize+1);
if(pSource==NULL)
return 0;
char *pDest=(char *)malloc(nSize+1);
if(pDest==NULL)
return 0;
memset(pSource,'a',nSize);
pSource[nSize]='\0';
DWORD dwStart=GetTickCount();
for(int i=0;i<5000000;i++)

{
strcpy(pDest,pSource);
}
DWORD dwend=GetTickCount();
printf("%d\n",dwend-dwStart);

當然對于我這種小菜肯定是不容易懂清楚的了,于是找了很多資料,才發現原來跟debug和release下strcpy的函數類型有關的,前者是內聯函數(inline),而后者是直接調用運行時庫的(這個在IDA中可以清楚的看到),于是這5000000次的調用的差距就體現出來了.
但是為什么同一個編譯器出來的執行文件出來的函數會有不同的類型呢?這就要扯到C運行時庫上邊了--Windows環境下,VC提供的 C run-time library分為動態運行時庫和靜態運行時庫。動態運行時庫主要是DLL庫文件msvcrt.dll(or MSVCRTD.DLL for debug build),對應的Import library文件是MSVCRT.LIB(MSVCRTD.LIB for debug build),而靜態運行時庫(release版)對應的主要文件是:LIBC.LIB (Single thread static library, retail version),LIBCMT.LIB (Multithread static library, retail version).由于這些運行時庫的實現者不同,所實現的函數也就不同了,而對于這個有趣的問題我們可以看到在MSVCRT.LIB中strcpy是內聯函數,而LIBC.LIB或LIBCMT.LIB中的不是了.
C運行時庫的相關文章在這:http://m.shnenglu.com/aqazero/archive/2007/09/21/14173.html
posted on 2008-05-06 20:06
Lexili 閱讀(514)
評論(0) 編輯 收藏 引用