• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            S.l.e!ep.¢%

            像打了激速一樣,以四倍的速度運(yùn)轉(zhuǎn),開(kāi)心的工作
            簡(jiǎn)單、開(kāi)放、平等的公司文化;尊重個(gè)性、自由與個(gè)人價(jià)值;
            posts - 1098, comments - 335, trackbacks - 0, articles - 1
              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            優(yōu)化C++程序編譯效率的實(shí)例

            Posted on 2012-02-26 16:40 S.l.e!ep.¢% 閱讀(2120) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): C++


            標(biāo) 題: 優(yōu)化C++程序編譯效率的實(shí)例
            作 者:FlyToTheSpace
            時(shí) 間:2005-12-27 22:12

            鏈 接:http://bbs.pediy.com/showthread.php?threadid=19823


            ?

            ?

            (1)自定義程序的入口
            ?(2)合并區(qū)段
            ?(3)不用調(diào)malloc,free等函數(shù)
            ?(3)不用cout來(lái)輸出,cin來(lái)輸入
            ?(4)如果調(diào)用了很多庫(kù)函數(shù)如memset,stycpy等等
            ?的話,請(qǐng)導(dǎo)入msvcrt.lib,不然編譯器會(huì)在程序里面
            ?導(dǎo)入靜態(tài)庫(kù),這樣的話程序就會(huì)大很多。。
            ?(5)window編程不用mfc...
            ?減少程序運(yùn)行內(nèi)存占用量可以調(diào)用
            ?SetProcessWorkingSetSize(GetCurrentProcess(),-1,-1);
            ?
            ----------sample.cpp---------------------
            ?#include <windows.h>
            ?#include "sample.h"
            ?#include "mydll.h"
            ?#include "resource.h"
            ?//這下面自定義函數(shù)入口
            ?#pragma comment(linker, "/ENTRY:EntryPoint")
            ?#pragma comment(linker,"/ALIGN:0x400")
            ?//設(shè)置區(qū)段屬性,跟區(qū)段在內(nèi)存起始地址
            ?//這里面要加寫(xiě)入的權(quán)限,不然程序就運(yùn)行不了了
            ?//E為執(zhí)行,R為可讀,W為可寫(xiě)
            ?//更多的說(shuō)明請(qǐng)參見(jiàn)msdn
            ?#pragma comment(linker,"/SECTION:.text,ERW /ALIGN:0x1000")
            ?//下面合并區(qū)段,
            ?#pragma comment(linker,"/merge:.data=.text")
            ?#pragma comment(linker,"/merge:.rdata=.text")
            ?//下面導(dǎo)入函數(shù)
            ?#pragma comment(lib,"mydll.lib")
            ?//下面是函數(shù)的入口
            ?//得到WinMain里面的幾個(gè)參數(shù)
            ?//HINSTANCE hInstance=GetModuleHandle(NULL)
            ?//LPSTR lpCmdLine= GetCommandLine()
            ?//int nCmdShow? 這個(gè)可以自己填
            ?void EntryPoint()
            ?{
            ?? HINSTANCE hInstance;
            ?? hInstance=GetModuleHandle(NULL);
            ?? Sample pro(hInstance);
            ?? DialogBoxParam(hInstance,MAKEINTRESOURCE(IDD_DIALOG),NULL,(DLGPROC)Sample::DialogProc,(LPARAM)&pro);
            ?}
            ?INT_PTR CALLBACK Sample::DialogProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
            ?{
            ?? static Sample *pro;
            ?? switch(message)
            ?? {
            ?? case WM_INITDIALOG:
            ???? pro=(Sample *)lParam;
            ???? pro->hwnd=hwnd;
            ???? pro->Init();
            ???? break;
            ?? case WM_COMMAND:
            ???? pro->WndPro_Command(wParam,lParam);
            ???? break;
            ?? case WM_CLOSE:
            ???? pro->WndPro_Close();
            ???? break;
            ?? case WM_TIMER:
            ???? //這里每秒鐘觸發(fā)一次
            ???? //來(lái)減少內(nèi)存占用量
            ????????????????????? //試著在任務(wù)管理器里面看一下,sample.exe內(nèi)存占用量是不是只有200多k,在我這里是這樣的
            ???? if(wParam==100)
            ???? {
            ?????? SetProcessWorkingSetSize(GetCurrentProcess(),
            ???????? -1,-1);
            ???? }
            ???? break;
            ?? }
            ?? return 0;
            ?}
            ?Sample::Sample(HINSTANCE hi)
            ?{
            ?? this->hInstance=hi;
            ?}
            ?int Sample::WndPro_Command(WPARAM wParam,LPARAM lParam)
            ?{
            ?? switch(wParam)
            ?? {
            ?? case IDOK:
            ???? this->LoadDll();
            ???? break;
            ?? case IDCANCEL:
            ???? this->WndPro_Close();
            ???? break;
            ?? }
            ?? return 0;
            ?}
            ?int Sample::WndPro_Close()
            ?{
            ?? EndDialog(hwnd,0);
            ?? return 0;
            ?}
            ?int Sample::Init()
            ?{
            ?? SetTimer(hwnd,100,100,NULL);
            ?? return 0;
            ?}
            ?int Sample::LoadDll()
            ?{
            ?? test(hwnd);
            ?? return 0;
            ?}
            ?UINT malloc_(size_t num)
            ?{
            ?? return (UINT)VirtualAlloc(NULL, num,MEM_RESERVE |MEM_COMMIT,PAGE_EXECUTE_READWRITE);
            ?}
            ?void free_(void * p)
            ?{
            ?? VirtualFree(p,NULL,MEM_RELEASE);
            ?}
            ?void ZeroMem(char * mem,int len)
            ?{
            ?? for(int i=0;i<len;i++)
            ???? mem[i]=0;
            ?}
            ?-------------------------------
            ?----------sample.h--------
            ?//下面是主函數(shù)的類(lèi)
            ?class Sample
            ?{
            ?public:
            ?? static INT_PTR CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM);
            ?? Sample(HINSTANCE);
            ?private:
            ?? HINSTANCE hInstance;
            ?? HWND hwnd;
            ?? int WndPro_Command(WPARAM,LPARAM);
            ?? int WndPro_Close();
            ?? int Init();
            ?? int LoadDll();
            ?};
            ?///-->下為精簡(jiǎn)的庫(kù)函數(shù)
            ?//分配內(nèi)存最好不用庫(kù)函數(shù)malloc,
            ?//不要用cout 來(lái)輸出
            ?//如果你調(diào)用了很多庫(kù)函數(shù)的話
            ?//請(qǐng)?jiān)趯?dǎo)入 msvcrt.lib
            ?UINT malloc_(size_t);//分配內(nèi)存
            ?void free_(void *);//釋放內(nèi)存
            ?void ZeroMem(char *,int);//清零
            ?-------------------------------
            ?---------mydll.cpp-----------
            ?#include <windows.h>
            ?#include "mydll.h"
            ?#pragma comment(linker, "/ENTRY:DllEntry")
            ?#pragma comment(linker,"/ALIGN:0x400")
            ?#pragma comment(linker,"/SECTION:.text,ERW /ALIGN:0x1000")
            ?#pragma comment(linker,"/merge:.data=.text")
            ?#pragma comment(linker,"/merge:.rdata=.text")
            ?BOOL APIENTRY DllEntry()
            ?{
            ?? return 1;
            ?}
            ?INT APIENTRY test(HWND hwnd)
            ?{
            ?? MessageBox(hwnd,"調(diào)用dll"," ",0);
            ?? return 0;
            ?}
            ?-----------------------
            ?下面是程序完整的代碼。。
            附件:sample.rar


            ?

            ?

            標(biāo) 題: 答復(fù)
            作 者:南蠻媽媽
            時(shí) 間:2005-12-27 22:30

            ?


            還能加些
            ?#pragma comment (linker, "/Filealign:0x200")
            ?#pragma comment (linker, "/OPT:REF")
            ?#pragma comment (linker, "/OPT:ICF")
            ?#pragma optimize("gsy", on)

            ?

            ?


            標(biāo) 題: 答復(fù)
            作 者:FlyToTheSpace
            時(shí) 間:2005-12-27 22:38

            ?


            #pragma comment (linker, "/Filealign:0x200")
            ?在cl 里面,沒(méi)這個(gè)選項(xiàng)。
            ?用下面這個(gè),但是加了沒(méi)用的,
            ?除非你的區(qū)段只有一個(gè)
            ?#pragma comment (linker, "/align:0x200")
            ?
            下面的選項(xiàng)我還沒(méi)用過(guò),
            ?#pragma comment (linker, "/OPT:REF")
            ?#pragma comment (linker, "/OPT:ICF")
            ?#pragma optimize("gsy", on)
            ?我編譯一般用命令行的,在.net 2003跟.net 2005
            ?里面的有好多選項(xiàng)連去都去不掉
            ?cl?? mydll.cpp mydll.def /link /dll /out:mydll.dll /machine:x86 /subsystem:windows user32.lib kernel32.lib
            ?rc sample.rc
            ?cl sample.cpp /link /machine:x86? user32.lib kernel32.lib /subsystem:windows sample.res
            ?del sample.obj sample.res? mydll.obj mydll.exp
            ?pause

            ?

            ?


            標(biāo) 題:Re: 優(yōu)化C++程序編譯效率的實(shí)例
            作 者:goldenegg
            時(shí) 間:2005-12-28 10:08

            ?

            ?


            引用:
            --------------------------------------------------------------------------------
            最初由 FlyToTheSpace 發(fā)布
            (1)自定義程序的入口
            (2)合并區(qū)段
            (3)不用調(diào)malloc,free等函數(shù)
            (3)不用cout來(lái)輸出,cin來(lái)輸入
            (4)如果調(diào)用了很多庫(kù)函數(shù)如memset,stycpy等等
            ........
            --------------------------------------------------------------------------------

            ?


            SetProcessWorkingSetSize只是給你感觀上的內(nèi)存變小而已,
            如果你弄個(gè)hook進(jìn)入photoshop這樣的程序去做這件事,
            你就會(huì)馬上發(fā)現(xiàn)為什么別人并不怎么用 SetProcessWorkingSetSize

            ?SetProcessWorkingSetSize只是把內(nèi)存寫(xiě)回磁盤(pán),當(dāng)用到時(shí)又要從磁盤(pán)加載回來(lái),程序一大,內(nèi)存量本身占用大,你次讀寫(xiě)磁盤(pán)那么慢,你就會(huì)發(fā)現(xiàn)雖然內(nèi)存占用量下去了,但是硬盤(pán)一真轉(zhuǎn)個(gè)不停,程序基本上動(dòng)不了...

            所以如何節(jié)內(nèi)存,不應(yīng)從SetProcessWorkingSetSize下手,
            當(dāng)然現(xiàn)在你寫(xiě)的小程序可以例外.

            其實(shí)如果有個(gè)界面,占用個(gè)1M的內(nèi)存實(shí)在是小事,不必要去計(jì)較.

            ?

            ?


            標(biāo) 題: 答復(fù)
            作 者:FlyToTheSpace
            時(shí) 間:2005-12-28 11:54

            ?


            SetProcessWorkingSetSize
            這個(gè)我是跟蹤realplay里面一個(gè)程序realsched.exe
            發(fā)現(xiàn)的,其它減少內(nèi)存用量的方法,還沒(méi)找到

            ?對(duì)于那些大一點(diǎn)的程序,就不能用settimer每隔段時(shí)間調(diào)用,
            ?當(dāng)程序的界面最小化時(shí),調(diào)用一下就可以了,
            ?比如potoshop 在顯示界面的時(shí)候,占用內(nèi)存會(huì)很大,但只要你將它最小化
            ?內(nèi)存占用量馬上就減下來(lái)了,很多大一點(diǎn)的程序都是這樣的。

            ?

            ?


            標(biāo) 題: 答復(fù)
            作 者:dummy
            時(shí) 間:2005-12-28 14:49

            ?


            cl.exe 有許多關(guān)于程序代碼優(yōu)化的開(kāi)關(guān):
            ?/////////////////////////////////////////////////////////
            ??????????????????????????????? -OPTIMIZATION-
            ?
            /O1 minimize space????? /Op[-] improve floating-pt consistency
            ?/O2 maximize speed????? /Os favor code space
            ?/Oa assume no aliasing?????????????????? /Ot favor code speed
            ?/Ob<n> inline expansion (default n=0)??? /Ow assume cross-function aliasing
            ?/Od disable optimizations (default)????? /Ox maximum opts. (/Ogityb1 /Gs)
            ?/Og enable global optimization?????????? /Oy[-] enable frame pointer omission
            ?/Oi enable intrinsic functions
            ?
            ???????????????????????????? -CODE GENERATION-
            ?
            /G3 optimize for 80386?????????????????? /Gy separate functions for linker
            ?/G4 optimize for 80486?????????????????? /Ge force stack checking for all funcs
            ?/G5 optimize for Pentium???????????????? /Gs[num] disable stack checking calls
            ?/G6 optimize for Pentium Pro???????????? /Gh enable hook function call
            ?/GB optimize for blended model (default) /GR[-] enable C++ RTTI
            ?/Gd __cdecl calling convention?????????? /GX[-] enable C++ EH (same as /EHsc)
            ?/Gr __fastcall calling convention??????? /Gi[-] enable incremental compilation
            ?/Gz __stdcall calling convention???????? /Gm[-] enable minimal rebuild
            ?/GA optimize for Windows Application???? /EHs enable synchronous C++ EH
            ?/GD optimize for Windows DLL???????????? /EHa enable asynchronous C++ EH
            ?/Gf enable string pooling??????????????? /EHc extern "C" defaults to nothrow
            ?/GF enable read-only string pooling????? /QIfdiv[-] enable Pentium FDIV fix
            ?/GZ enable runtime debug checks????????? /QI0f[-] enable Pentium 0x0f fix

            ?

            ?


            標(biāo) 題: 答復(fù)
            作 者:dwing
            時(shí) 間:2005-12-28 15:59

            ?


            我有中文版的編譯器:
            ?
            Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86
            ?Copyright (C) Microsoft Corporation 1984-2002. All rights reserved.
            ?
            ????????????????????????? C/C++ 編譯器選項(xiàng)
            ?
            ????????????????????????????? -優(yōu)化-
            ?
            /O1 最小化空間????????????????????????? /Op[-] 改善浮點(diǎn)數(shù)一致性
            ?/O2 最大化速度????????????????????????? /Os 優(yōu)選代碼空間
            ?/Oa 假設(shè)沒(méi)有別名??????????????????????? /Ot 優(yōu)選代碼速度
            ?/Ob<n> 內(nèi)聯(lián)展開(kāi)(默認(rèn) n=0)?????????????? /Ow 假設(shè)交叉函數(shù)別名
            ?/Od 禁用優(yōu)化(默認(rèn)值)??????????????????? /Ox 最大化選項(xiàng)。(/Ogityb2 /Gs)
            ?/Og 啟用全局優(yōu)化??????????????????????? /Oy[-] 啟用框架指針省略
            ?/Oi 啟用內(nèi)部函數(shù)
            ?
            ???????????????????????????? -代碼生成-
            ?
            /G3 為 80386 進(jìn)行優(yōu)化?????????????????? /Gh 啟用 _penter 函數(shù)調(diào)用
            ?/G4 為 80486 進(jìn)行優(yōu)化?????????????????? /GH 啟用 _pexit 函數(shù)調(diào)用
            ?/G5 為 Pentium 進(jìn)行優(yōu)化???????????????? /GR[-] 啟用 C++ RTTI
            ?/G6 對(duì) PPro、P-II、P-III 進(jìn)行優(yōu)化?????? /GX[-] 啟用 C++ EH (與 /EHsc 相同)
            ?/G7 對(duì) Pentium 4 或 Athlon 進(jìn)行優(yōu)化???? /EHs 啟用 C++ EH (沒(méi)有 SEH 異常)
            ?/GB 為混合模型進(jìn)行優(yōu)化(默認(rèn))??????????? /EHa 啟用 C++ EH(w/ SEH 異常)
            ?/Gd __cdecl 調(diào)用約定??????????????????? /EHc extern "C" 默認(rèn)為 nothrow
            ?/Gr __fastcall 調(diào)用約定???????????????? /GT 生成纖維安全 TLS 訪問(wèn)
            ?/Gz __stdcall 調(diào)用約定????????????????? /Gm[-] 啟用最小重新生成
            ?/GA 為 Windows 應(yīng)用程序進(jìn)行優(yōu)化???????? /GL[-] 啟用鏈接時(shí)代碼生成
            ?(按 <Enter> 繼續(xù))
            ?/Gf 啟用字符串池??????????????????????? /QIfdiv[-] 啟用 Pentium FDIV 修復(fù)
            ?/GF 啟用只讀字符串池??????????????????? /QI0f[-] 啟用 Pentium 0x0f 修復(fù)
            ?/Gy 分隔鏈接器函數(shù)????????????????????? /QIfist[-] 使用 FIST 而不是 ftol()
            ?/GZ 啟用堆棧檢查(/RTCs)???????????????? /RTC1 啟用快速檢查(/RTCsu)
            ?/Ge 對(duì)所有函數(shù)強(qiáng)制堆棧檢查????????????? /RTCc 轉(zhuǎn)換為較小的類(lèi)型檢查
            ?/Gs[num] 控制堆棧檢查調(diào)用?????????????? /RTCs 堆棧幀運(yùn)行時(shí)檢查
            ?/GS 啟用安全檢查??????????????????????? /RTCu 未初始化的本地用法檢查
            ?/clr[:noAssembly] 為公共語(yǔ)言運(yùn)行庫(kù)編譯
            ???? noAssembly - 不產(chǎn)生程序集
            ?/arch:<SSE|SSE2> CPU 結(jié)構(gòu)的最低要求,以下內(nèi)容之一:
            ???? SSE - 啟用支持 SSE 的 CPU 可用的指令
            ???? SSE2 - 啟用支持 SSE2 的 CPU 可用的指令
            ?
            ????????????????????????????? -輸出文件-
            ?
            /Fa[file] 命名程序集列表文件??????????? /Fo<file> 命名對(duì)象文件
            ?/FA[sc] 配置程序集列表????????????????? /Fp<file> 命名預(yù)編譯頭文件
            ?/Fd[file] 命名 .PDB 文件??????????????? /Fr[file] 命名源瀏覽器文件
            ?/Fe<file> 命名可執(zhí)行文件??????????????? /FR[file] 命名擴(kuò)展 .SBR 文件
            ?/Fm[file] 命名映射文件
            ?
            ????????????????????????????? -預(yù)處理器-
            ?
            /AI<dir> 添加到程序集搜索路徑?????????? /Fx 將插入的代碼合并到文件
            ?(按 <Enter> 繼續(xù))
            ?/FU<file> 強(qiáng)制使用程序集/模塊?????????? /FI<file> 命名強(qiáng)制包含文件
            ?/C 不抽出注釋?????????????????????????? /U<name> 移除預(yù)定義宏
            ?/D<name>{=|#}<text> 定義宏????????????? /u 移除所有預(yù)定義宏
            ?/E 預(yù)處理到 stdout????????????????????? /I<dir> 添加到包含搜索路徑
            ?/EP 預(yù)處理到 stdout,沒(méi)有 #line???????? /X 忽略“標(biāo)準(zhǔn)位置”
            ?/P 預(yù)處理到文件
            ?
            ??????????????????????????????? -語(yǔ)言-
            ?
            /Zi 啟用調(diào)試信息??????????????????????? /Ze 啟用擴(kuò)展(默認(rèn))
            ?/ZI 啟用“編輯并繼續(xù)”調(diào)試信息????????? /Zl 省略 .OBJ 中的默認(rèn)庫(kù)名
            ?/Z7 啟用舊式調(diào)試信息??????????????????? /Zg 生成函數(shù)原型
            ?/Zd 僅有行號(hào)調(diào)試信息??????????????????? /Zs 只進(jìn)行語(yǔ)法檢查
            ?/Zp[n] 在 n 字節(jié)邊界上包裝結(jié)構(gòu)????????? /vd{0|1} 禁用/啟用 vtordisp
            ?/Za 禁用擴(kuò)展(暗指 /Op)????????????????? /vm<x> 指向成員的指針類(lèi)型
            ?/Zc:arg1[,arg2] C++ 語(yǔ)言一致性,這里的參數(shù)可以是:
            ???? forScope - 對(duì)范圍規(guī)則強(qiáng)制使用標(biāo)準(zhǔn) C++
            ???? wchar_t - wchar_t 是本機(jī)類(lèi)型,不是 typedef
            ?
            ????????????????????????????? - 雜項(xiàng) -
            ?
            @<file> 選項(xiàng)響應(yīng)文件??????????????????? /wo<n> 發(fā)出一次警告 n
            ?/?, /help 打印此幫助消息??????????????? /w<l><n> 為 n 設(shè)置警告等級(jí) 1-4
            ?/c 只編譯,不鏈接?????????????????????? /W<n> 設(shè)置警告等級(jí)(默認(rèn) n=1)
            ?(按 <Enter> 繼續(xù))
            ?/H<num> 最大外部名稱(chēng)長(zhǎng)度??????????????? /Wall 啟用所有警告
            ?/J 默認(rèn) char 類(lèi)型是 unsigned??????????? /Wp64 啟用 64 位端口定位警告
            ?/nologo 取消顯示版權(quán)消息??????????????? /WX 將警告視為錯(cuò)誤
            ?/showIncludes 顯示包含文件名??????????? /WL 啟用單行診斷
            ?/Tc<source file> 將文件編譯為 .c??????? /Yc[file] 創(chuàng)建 .PCH 文件
            ?/Tp<source file> 將文件編譯為 .cpp????? /Yd 將調(diào)試信息放在每個(gè) .OBJ 中
            ?/TC 將所有文件編譯為 .c???????????????? /Yl[sym] 為調(diào)試庫(kù)插入 .PCH 引用
            ?/TP 將所有文件編譯為 .cpp?????????????? /Yu[file] 使用 .PCH 文件
            ?/V<string> 設(shè)置版本字符串?????????????? /YX[file] 自動(dòng) .PCH
            ?/w 禁用所有警告???????????????????????? /Y- 禁用所有 PCH 選項(xiàng)
            ?/wd<n> 禁用警告 n?????????????????????? /Zm<n> 最大內(nèi)存分配(默認(rèn)為 %)
            ?/we<n> 將警告 n 視為錯(cuò)誤
            ?
            ???????????????????????????????? -鏈接-
            ?
            /MD 與 MSVCRT.LIB 鏈接????????????????? /MDd 與 MSVCRTD.LIB 調(diào)試庫(kù)鏈接
            ?/ML 與 LIBC.LIB 鏈接??????????????????? /MLd 與 LIBCD.LIB 調(diào)試庫(kù)鏈接
            ?/MT 與 LIBCMT.LIB 鏈接????????????????? /MTd 與 LIBCMTD.LIB 調(diào)試庫(kù)鏈接
            ?/LD 創(chuàng)建 .DLL?????????????????????????? /F<num> 設(shè)置堆棧大小
            ?/LDd 創(chuàng)建 .DLL 調(diào)試庫(kù)?????????????????? /link [鏈接器選項(xiàng)和庫(kù)]

            ?

            ?


            標(biāo) 題:Re: 優(yōu)化C++程序編譯效率的實(shí)例
            作 者:dwing
            時(shí) 間:2005-12-28 16:49

            ?


            樓主的文章寫(xiě)的不錯(cuò)!
            ?但標(biāo)題寫(xiě)的有點(diǎn)疑慮.
            ?因?yàn)閮?yōu)化有幾種意義:速度優(yōu)化,代碼空間優(yōu)化,編譯速度優(yōu)化和內(nèi)存占用優(yōu)化.
            ?一般來(lái)說(shuō)需要速度優(yōu)化的地方,代碼空間優(yōu)化和內(nèi)存占用優(yōu)化就要犧牲一些.
            ?
            編譯速度優(yōu)化可能意義不太大,不過(guò)我還是補(bǔ)充一下:
            ?例如添加以下宏可以提高一些編譯速度,在硬盤(pán)和CPU速度較慢的機(jī)器上尤為明顯.
            ?#define VC_EXTRALEAN
            ?#define WIN32_LEAN_AND_MEAN
            ?#define WIN32_EXTRA_LEAN
            ?另外如果關(guān)閉預(yù)編譯頭文件的功能,可以大大提高第一次編譯的速度,并減少硬盤(pán)占用的空間.
            ?強(qiáng)烈建議編譯小程序的時(shí)候關(guān)閉這個(gè)功能,因?yàn)樗J(rèn)是啟動(dòng)的.
            ?
            下面評(píng)價(jià)一下樓主的一些優(yōu)化,僅供參考.
            ?


            引用:
            --------------------------------------------------------------------------------
            (1)自定義程序的入口
            --------------------------------------------------------------------------------

            ?

            ?一般不建議使用自定義入口,雖然只有使用動(dòng)態(tài)庫(kù)時(shí)只節(jié)省不到1KB.
            ?主要是考慮到C++的全局對(duì)象的構(gòu)造,如果自定義就會(huì)被忽略掉.
            ?不過(guò)如果確實(shí)想使代碼精簡(jiǎn)到極限,可以考慮.
            ?此優(yōu)化對(duì)速度幾乎無(wú)影響.
            ?


            引用:
            --------------------------------------------------------------------------------
            (2)合并區(qū)段
            --------------------------------------------------------------------------------

            ?

            ?這一項(xiàng)對(duì)減小PE文件大小很有幫助,但一定要注意正確設(shè)置好節(jié)(段)屬性,否則后果不可知.
            ?表面上此優(yōu)化對(duì)速度無(wú)影響,但可能會(huì)導(dǎo)致數(shù)據(jù)cache與代碼cache重疊,不利于CPU的執(zhí)行.
            ?如果需要加壓縮殼,此優(yōu)化可能無(wú)效,如果合并不當(dāng)可能還會(huì)使壓縮能力降低(例如代碼被混合在數(shù)據(jù)當(dāng)中).
            ?


            引用:
            --------------------------------------------------------------------------------
            (3)不用調(diào)malloc,free等函數(shù)
            --------------------------------------------------------------------------------

            ?

            ?分配內(nèi)存不用malloc,free等函數(shù)用什么?new和delete嗎?后者當(dāng)然更好:)
            ?Win32API有眾多分配內(nèi)存的函數(shù),malloc等C/C++標(biāo)準(zhǔn)庫(kù)當(dāng)然使用的是API中的
            ?堆分配(HeapAlloc),而堆分配調(diào)用虛擬分配(VirtualAlloc).效率當(dāng)然是后者高一些.
            ?但實(shí)際內(nèi)存分配一般在初始化過(guò)程中使用,而且使用次數(shù)也不應(yīng)過(guò)多(以避免內(nèi)存碎片).
            ?所以速度影響幾乎可忽略.
            ?代碼量應(yīng)該不會(huì)有太大影響.
            ?


            引用:
            --------------------------------------------------------------------------------
            (3)不用cout來(lái)輸出,cin來(lái)輸入
            --------------------------------------------------------------------------------

            ?

            ?這個(gè)確實(shí)可以使用C標(biāo)準(zhǔn)庫(kù)來(lái)替代,而且使用靈活,速度更快一些.
            ?如果使用動(dòng)態(tài)庫(kù),代碼量差距不大.
            ?


            引用:
            --------------------------------------------------------------------------------
            (4)如果調(diào)用了很多庫(kù)函數(shù)如memset,stycpy等等的話,請(qǐng)導(dǎo)入msvcrt.lib,
            ?不然編譯器會(huì)在程序里面導(dǎo)入靜態(tài)庫(kù),這樣的話程序就會(huì)大很多。。
            --------------------------------------------------------------------------------

            ?

            ?這點(diǎn)不用擔(dān)心了.原因如下:
            ?如果使用最快速度優(yōu)化,memset,stycpy,sin等某些內(nèi)存/字符串/數(shù)學(xué)函數(shù)會(huì)被自動(dòng)內(nèi)聯(lián)到程序中,
            ?無(wú)論是否使用動(dòng)態(tài)庫(kù)還是靜態(tài)庫(kù),速度要快的多,我也推薦這么做.
            ?使用次數(shù)過(guò)多代碼量會(huì)大一些.但如果加壓縮殼的話影響不會(huì)太大.
            ?如果使用最小代碼優(yōu)化,自動(dòng)內(nèi)聯(lián)的函數(shù)不會(huì)內(nèi)聯(lián),此時(shí)可使用動(dòng)態(tài)庫(kù)以減小代碼量.
            ?如果只使用1~2次某個(gè)可自動(dòng)內(nèi)聯(lián)的函數(shù)的話代碼量可能反而更多(還要考慮到導(dǎo)入表)
            ?


            引用:
            --------------------------------------------------------------------------------
            (5)window編程不用mfc...
            --------------------------------------------------------------------------------

            ?

            ?呵呵,這就不一定了.目前如果沒(méi)有還在使用Win95系統(tǒng)的話,MFC的動(dòng)態(tài)庫(kù)就可以大膽使用了.
            ?但要注意一定要使用MFC42.DLL的庫(kù),也就是VC6.0自帶的庫(kù),高版本的可能連WinXP也不會(huì)自帶.
            ?


            引用:
            --------------------------------------------------------------------------------
            減少程序運(yùn)行內(nèi)存占用量可以調(diào)用SetProcessWorkingSetSize(GetCurrentProcess(),-1,-1);
            --------------------------------------------------------------------------------

            ?

            ?又學(xué)到一招!
            ?但我不得不說(shuō)一下:這是個(gè)騙人的招數(shù).拿來(lái)騙一騙初級(jí)用戶(hù)還可以-_-
            ?因?yàn)槿蝿?wù)管理器只顯示進(jìn)程當(dāng)前使用的物理內(nèi)存大小,所以使用這個(gè)招數(shù)雖然可以降低物理內(nèi)存占用.
            ?但虛擬內(nèi)存并無(wú)減少,所以這個(gè)技巧只建議使用在后臺(tái)或很少工作的進(jìn)程.
            ?經(jīng)常使用這個(gè)函數(shù)會(huì)造成CPU負(fù)擔(dān)過(guò)重,磁盤(pán)交換文件的讀寫(xiě)也會(huì)更頻繁.這樣會(huì)很影響進(jìn)程的執(zhí)行效率.
            ?其實(shí)不需要在意物理內(nèi)存占用,如果物理內(nèi)存不夠用,系統(tǒng)會(huì)自動(dòng)降低不常工作的進(jìn)程的物理內(nèi)存.

            ?

            ?


            標(biāo) 題: 答復(fù)
            作 者:dwing
            時(shí) 間:2005-12-28 17:05

            ?


            再補(bǔ)充幾點(diǎn):


            引用:
            --------------------------------------------------------------------------------
            #pragma comment (linker, "/align:0x200")
            --------------------------------------------------------------------------------

            ?

            ?這著我也經(jīng)常用,不過(guò)我經(jīng)常這么寫(xiě)(只用于VC6.0):
            ?#pragma comment(linker,"/OPT:NOWIN98")
            ?但是如果要加壓縮殼的話,這個(gè)PE文件空間優(yōu)化沒(méi)有一點(diǎn)作用,
            ?因?yàn)樘摂M地址沒(méi)有改變(仍然是4KB,而且無(wú)法改變).
            ?


            引用:
            --------------------------------------------------------------------------------
            #pragma comment (linker, "/ALIGN:16")
            --------------------------------------------------------------------------------

            ?

            ?對(duì)齊到16字節(jié)可能有兼容性問(wèn)題,可能不能在Win9x中運(yùn)行.
            ?


            引用:
            --------------------------------------------------------------------------------
            #pragma comment(linker, "/ENTRY:EntryPoint")
            --------------------------------------------------------------------------------

            ?

            ?如果沒(méi)有不加入默認(rèn)庫(kù)的話可以不用自定義入口.
            ?而直接用void mainCRTStartup()或void WinMainCRTStartup()即可.
            ?但不使用默認(rèn)庫(kù)可能某些浮點(diǎn)數(shù)的轉(zhuǎn)換會(huì)出現(xiàn)問(wèn)題,雖然可以使用其他方法解決.
            ?


            引用:
            --------------------------------------------------------------------------------
            #pragma comment (linker, "/OPT:REF")
            ?#pragma comment (linker, "/OPT:ICF")
            --------------------------------------------------------------------------------

            ?

            ?這一項(xiàng)其實(shí)在默認(rèn)的優(yōu)化編譯設(shè)置中已經(jīng)有了,不用寫(xiě)出來(lái).
            ?如果啟動(dòng)"/OPT:REF"的話,"/OPT:ICF"默認(rèn)會(huì)自動(dòng)啟動(dòng).
            ?


            引用:
            --------------------------------------------------------------------------------
            #pragma comment (linker,"/merge:.rsrc=.text")
            --------------------------------------------------------------------------------

            ?

            ?這項(xiàng)一定不要加,有時(shí)候如果資源不在某個(gè)節(jié)(段)的開(kāi)始,程序的圖標(biāo)可能不能顯示出來(lái).

            ?

            ?


            標(biāo) 題: 答復(fù)
            作 者:goldenegg
            時(shí) 間:2005-12-29 21:13

            ?

            ?


            引用:
            --------------------------------------------------------------------------------
            最初由 FlyToTheSpace 發(fā)布
            ?SetProcessWorkingSetSize
            ?這個(gè)我是跟蹤realplay里面一個(gè)程序realsched.exe
            ?發(fā)現(xiàn)的,其它減少內(nèi)存用量的方法,還沒(méi)找到
            ?
            對(duì)于那些大一點(diǎn)的程序,就不能用settimer每隔段時(shí)間調(diào)用,
            ?........
            --------------------------------------------------------------------------------

            ?

            ?nono,不是大的程序自己搞的,是操作系統(tǒng)做的。
            ?在你的窗口最小化的時(shí)候,操作系統(tǒng)自動(dòng)幫你把內(nèi)存最小化了。
            ?所以,你自己就更沒(méi)有必要去調(diào)這個(gè)函數(shù)了。
            ?


            引用:
            --------------------------------------------------------------------------------
            最初由 dwing 發(fā)布
            ?
            呵呵,這就不一定了.目前如果沒(méi)有還在使用Win95系統(tǒng)的話,MFC的動(dòng)態(tài)庫(kù)就可以大膽使用了.
            ?但要注意一定要使用MFC42.DLL的庫(kù),也就是VC6.0自帶的庫(kù),高版本的可能連WinXP也不會(huì)自帶.
            ?
            --------------------------------------------------------------------------------

            ?

            nono,mfc42.dll從win98se開(kāi)始,到longhorn都是默認(rèn)有的。vc6 mfc的程序,編成release就可以在每臺(tái)機(jī)器上跑了,不用到處拷個(gè)mfc42.dll

            ?

            ?


            標(biāo) 題: 答復(fù)
            作 者:dwing
            時(shí) 間:2005-12-30 15:38

            ?

            ?


            引用:
            --------------------------------------------------------------------------------
            最初由 goldenegg 發(fā)布
            ?nono,mfc42.dll從win98se開(kāi)始,到longhorn都是默認(rèn)有的。vc6 mfc的程序,編成release就可以在每臺(tái)機(jī)器上跑了,不用到處拷個(gè)mfc42.dll
            ?........
            --------------------------------------------------------------------------------

            ?

            ?可能是對(duì)我的話理解有誤.我們的觀點(diǎn)是一樣的.
            ?再補(bǔ)充一下:
            ?Win95OSR2(Win97)雖然自帶msvcrt40.dll和mfc30.dll,但不是目前的標(biāo)準(zhǔn)庫(kù)了.
            ?Win98SE自帶了msvcrt.dll和mfc42.dll,Win98第一版不知有沒(méi)有.
            ?WinXP第一版肯定不帶msvcr71.dll和mfc71.dll,這些是VC7.1才使用的動(dòng)態(tài)庫(kù).

            久久久久香蕉视频| 久久精品中文字幕有码| 国产精品99久久久精品无码| 青青草国产成人久久91网| 91精品日韩人妻无码久久不卡| 91精品国产乱码久久久久久 | 久久精品99久久香蕉国产色戒| 久久精品人人做人人爽97| 93精91精品国产综合久久香蕉| 久久久精品日本一区二区三区 | 久久99国产精一区二区三区| 97超级碰碰碰碰久久久久| 久久久午夜精品福利内容| 久久久精品2019免费观看| 日本高清无卡码一区二区久久| 久久婷婷色综合一区二区| 久久精品国产99久久丝袜| 久久久久亚洲AV无码专区体验| 久久亚洲精品中文字幕| 日韩欧美亚洲综合久久| 国产精品国色综合久久| 18禁黄久久久AAA片| 国产2021久久精品| 精品国产一区二区三区久久久狼| 国产精品成人无码久久久久久| 色欲久久久天天天综合网| 久久人人超碰精品CAOPOREN| 热re99久久精品国产99热| 久久亚洲AV成人出白浆无码国产| 午夜精品久久影院蜜桃| AA级片免费看视频久久| 91精品国产91久久综合| 久久这里只有精品18| 久久WWW免费人成一看片| 一级做a爰片久久毛片毛片| 国产叼嘿久久精品久久| 久久综合狠狠色综合伊人| 久久91精品国产91久久麻豆 | 国产成人精品综合久久久| 午夜精品久久久久久久无码| 亚洲а∨天堂久久精品9966|