lstrcat(lpDst, szByte); } // 处理最后一个字节 wsprintf(szByte, "%02X", lpbySrc[i]); lstrcat(lpDst, szByte); free(lpbySrc); lpbySrc = NULL; CloseHandle(hFileSrc); // 保存到目标文件 hFileDst = CreateFile(szFileDst, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL); WriteFile(hFileDst, (LPCVOID)lpDst, lstrlen(lpDst) * sizeof(TCHAR), &dwReaded, NULL); free(lpDst); lpDst = NULL; CloseHandle(hFileDst); } 当把这段代码拉上阵的时候,我发现虽然它可以正常工作,结果也是我想要的,但是它处理文件的速度慢得出奇,甚至文件的大小相差几十K都会有明显的速度差距!我再次浏览了一遍我的代码,还是没有发现什么致命的错误。我灵机一动,心想还好我用的是GUI界面,于是我没费多少力气,在这个线程中加了几行代码和一个Progress Bar,继续编译运行。 这次的结果出来了,我发现指示字节处理进度的那个Progress Bar越往后走进展速度越慢。我恍然大悟,打开了VC附带的strcat源码: char * __cdecl strcat (char * dst, const char * src) { char * cp = dst; while( *cp ) cp++; /* find end of dst */ while( *cp++ = *src++ ) ; /* Copy src to end of dst */ return( dst ); /* return dst */ } 这个过程很明了,先查找字符串末尾的结束符,然后再进行字符串的复制。那么在我的代码中,每完成一次循环,lstrcat就要不厌其烦地去寻找一遍结束符,然后再进行复制——这也就造成了很多无用功,也就是Progress Bar越走越慢的原因。
|
闂傚倸鍊搁崐宄懊归崶顒€违闁逞屽墴閺屾稓鈧綆鍋呭畷宀勬煛瀹€鈧崰鏍€佸☉妯峰牚闁告劗鍋撳В澶嬩繆閻愵亜鈧垿宕曢弻銉ュ瀭闁秆勵殔閽冪喖鏌i弮鍥モ偓鈧柛瀣尭閳藉鈻嶉褌绨奸柟渚垮姂瀹曟儼顦柡鈧懞銉d簻闁哄洨鍋為ˉ鐐烘倵濮樼偓瀚�闂傚倸鍊搁崐椋庣矆娓氣偓楠炴牠顢曢妶鍡椾粡濡炪倖鍔х粻鎴犲閸ф鐓曢柟閭﹀灱閸ゅ鏌ら弶鎸庡仴闁哄本绋戦埥澶娾枎閹邦喚鈻忕紓鍌氬€风拋鏌ュ疾閻樿钃熼柣鏃傗拡閺佸秵绻濇繝鍌氭灓闁哄棭鍘奸—鍐Χ閸愩劌濮烽梺鐟板殩閹凤拷>>
正在阅读:VC++学习:字符串黑箱的背后VC++学习:字符串黑箱的背后
2004-03-01 10:18
出处:CSDN
责任编辑:linjixiong
键盘也能翻页,试试“← →”键