• <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.¢%

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

            優化C++程序編譯效率的實例

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


            標 題: 優化C++程序編譯效率的實例
            作 者:FlyToTheSpace
            時 間:2005-12-27 22:12

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


            ?

            ?

            (1)自定義程序的入口
            ?(2)合并區段
            ?(3)不用調malloc,free等函數
            ?(3)不用cout來輸出,cin來輸入
            ?(4)如果調用了很多庫函數如memset,stycpy等等
            ?的話,請導入msvcrt.lib,不然編譯器會在程序里面
            ?導入靜態庫,這樣的話程序就會大很多。。
            ?(5)window編程不用mfc...
            ?減少程序運行內存占用量可以調用
            ?SetProcessWorkingSetSize(GetCurrentProcess(),-1,-1);
            ?
            ----------sample.cpp---------------------
            ?#include <windows.h>
            ?#include "sample.h"
            ?#include "mydll.h"
            ?#include "resource.h"
            ?//這下面自定義函數入口
            ?#pragma comment(linker, "/ENTRY:EntryPoint")
            ?#pragma comment(linker,"/ALIGN:0x400")
            ?//設置區段屬性,跟區段在內存起始地址
            ?//這里面要加寫入的權限,不然程序就運行不了了
            ?//E為執行,R為可讀,W為可寫
            ?//更多的說明請參見msdn
            ?#pragma comment(linker,"/SECTION:.text,ERW /ALIGN:0x1000")
            ?//下面合并區段,
            ?#pragma comment(linker,"/merge:.data=.text")
            ?#pragma comment(linker,"/merge:.rdata=.text")
            ?//下面導入函數
            ?#pragma comment(lib,"mydll.lib")
            ?//下面是函數的入口
            ?//得到WinMain里面的幾個參數
            ?//HINSTANCE hInstance=GetModuleHandle(NULL)
            ?//LPSTR lpCmdLine= GetCommandLine()
            ?//int nCmdShow? 這個可以自己填
            ?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:
            ???? //這里每秒鐘觸發一次
            ???? //來減少內存占用量
            ????????????????????? //試著在任務管理器里面看一下,sample.exe內存占用量是不是只有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--------
            ?//下面是主函數的類
            ?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();
            ?};
            ?///-->下為精簡的庫函數
            ?//分配內存最好不用庫函數malloc,
            ?//不要用cout 來輸出
            ?//如果你調用了很多庫函數的話
            ?//請在導入 msvcrt.lib
            ?UINT malloc_(size_t);//分配內存
            ?void free_(void *);//釋放內存
            ?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,"調用dll"," ",0);
            ?? return 0;
            ?}
            ?-----------------------
            ?下面是程序完整的代碼。。
            附件:sample.rar


            ?

            ?

            標 題: 答復
            作 者:南蠻媽媽
            時 間:2005-12-27 22:30

            ?


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

            ?

            ?


            標 題: 答復
            作 者:FlyToTheSpace
            時 間:2005-12-27 22:38

            ?


            #pragma comment (linker, "/Filealign:0x200")
            ?在cl 里面,沒這個選項。
            ?用下面這個,但是加了沒用的,
            ?除非你的區段只有一個
            ?#pragma comment (linker, "/align:0x200")
            ?
            下面的選項我還沒用過,
            ?#pragma comment (linker, "/OPT:REF")
            ?#pragma comment (linker, "/OPT:ICF")
            ?#pragma optimize("gsy", on)
            ?我編譯一般用命令行的,在.net 2003跟.net 2005
            ?里面的有好多選項連去都去不掉
            ?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

            ?

            ?


            標 題:Re: 優化C++程序編譯效率的實例
            作 者:goldenegg
            時 間:2005-12-28 10:08

            ?

            ?


            引用:
            --------------------------------------------------------------------------------
            最初由 FlyToTheSpace 發布
            (1)自定義程序的入口
            (2)合并區段
            (3)不用調malloc,free等函數
            (3)不用cout來輸出,cin來輸入
            (4)如果調用了很多庫函數如memset,stycpy等等
            ........
            --------------------------------------------------------------------------------

            ?


            SetProcessWorkingSetSize只是給你感觀上的內存變小而已,
            如果你弄個hook進入photoshop這樣的程序去做這件事,
            你就會馬上發現為什么別人并不怎么用 SetProcessWorkingSetSize

            ?SetProcessWorkingSetSize只是把內存寫回磁盤,當用到時又要從磁盤加載回來,程序一大,內存量本身占用大,你次讀寫磁盤那么慢,你就會發現雖然內存占用量下去了,但是硬盤一真轉個不停,程序基本上動不了...

            所以如何節內存,不應從SetProcessWorkingSetSize下手,
            當然現在你寫的小程序可以例外.

            其實如果有個界面,占用個1M的內存實在是小事,不必要去計較.

            ?

            ?


            標 題: 答復
            作 者:FlyToTheSpace
            時 間:2005-12-28 11:54

            ?


            SetProcessWorkingSetSize
            這個我是跟蹤realplay里面一個程序realsched.exe
            發現的,其它減少內存用量的方法,還沒找到

            ?對于那些大一點的程序,就不能用settimer每隔段時間調用,
            ?當程序的界面最小化時,調用一下就可以了,
            ?比如potoshop 在顯示界面的時候,占用內存會很大,但只要你將它最小化
            ?內存占用量馬上就減下來了,很多大一點的程序都是這樣的。

            ?

            ?


            標 題: 答復
            作 者:dummy
            時 間:2005-12-28 14:49

            ?


            cl.exe 有許多關于程序代碼優化的開關:
            ?/////////////////////////////////////////////////////////
            ??????????????????????????????? -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

            ?

            ?


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

            ?

            ?


            標 題:Re: 優化C++程序編譯效率的實例
            作 者:dwing
            時 間:2005-12-28 16:49

            ?


            樓主的文章寫的不錯!
            ?但標題寫的有點疑慮.
            ?因為優化有幾種意義:速度優化,代碼空間優化,編譯速度優化和內存占用優化.
            ?一般來說需要速度優化的地方,代碼空間優化和內存占用優化就要犧牲一些.
            ?
            編譯速度優化可能意義不太大,不過我還是補充一下:
            ?例如添加以下宏可以提高一些編譯速度,在硬盤和CPU速度較慢的機器上尤為明顯.
            ?#define VC_EXTRALEAN
            ?#define WIN32_LEAN_AND_MEAN
            ?#define WIN32_EXTRA_LEAN
            ?另外如果關閉預編譯頭文件的功能,可以大大提高第一次編譯的速度,并減少硬盤占用的空間.
            ?強烈建議編譯小程序的時候關閉這個功能,因為它默認是啟動的.
            ?
            下面評價一下樓主的一些優化,僅供參考.
            ?


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

            ?

            ?一般不建議使用自定義入口,雖然只有使用動態庫時只節省不到1KB.
            ?主要是考慮到C++的全局對象的構造,如果自定義就會被忽略掉.
            ?不過如果確實想使代碼精簡到極限,可以考慮.
            ?此優化對速度幾乎無影響.
            ?


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

            ?

            ?這一項對減小PE文件大小很有幫助,但一定要注意正確設置好節(段)屬性,否則后果不可知.
            ?表面上此優化對速度無影響,但可能會導致數據cache與代碼cache重疊,不利于CPU的執行.
            ?如果需要加壓縮殼,此優化可能無效,如果合并不當可能還會使壓縮能力降低(例如代碼被混合在數據當中).
            ?


            引用:
            --------------------------------------------------------------------------------
            (3)不用調malloc,free等函數
            --------------------------------------------------------------------------------

            ?

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


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

            ?

            ?這個確實可以使用C標準庫來替代,而且使用靈活,速度更快一些.
            ?如果使用動態庫,代碼量差距不大.
            ?


            引用:
            --------------------------------------------------------------------------------
            (4)如果調用了很多庫函數如memset,stycpy等等的話,請導入msvcrt.lib,
            ?不然編譯器會在程序里面導入靜態庫,這樣的話程序就會大很多。。
            --------------------------------------------------------------------------------

            ?

            ?這點不用擔心了.原因如下:
            ?如果使用最快速度優化,memset,stycpy,sin等某些內存/字符串/數學函數會被自動內聯到程序中,
            ?無論是否使用動態庫還是靜態庫,速度要快的多,我也推薦這么做.
            ?使用次數過多代碼量會大一些.但如果加壓縮殼的話影響不會太大.
            ?如果使用最小代碼優化,自動內聯的函數不會內聯,此時可使用動態庫以減小代碼量.
            ?如果只使用1~2次某個可自動內聯的函數的話代碼量可能反而更多(還要考慮到導入表)
            ?


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

            ?

            ?呵呵,這就不一定了.目前如果沒有還在使用Win95系統的話,MFC的動態庫就可以大膽使用了.
            ?但要注意一定要使用MFC42.DLL的庫,也就是VC6.0自帶的庫,高版本的可能連WinXP也不會自帶.
            ?


            引用:
            --------------------------------------------------------------------------------
            減少程序運行內存占用量可以調用SetProcessWorkingSetSize(GetCurrentProcess(),-1,-1);
            --------------------------------------------------------------------------------

            ?

            ?又學到一招!
            ?但我不得不說一下:這是個騙人的招數.拿來騙一騙初級用戶還可以-_-
            ?因為任務管理器只顯示進程當前使用的物理內存大小,所以使用這個招數雖然可以降低物理內存占用.
            ?但虛擬內存并無減少,所以這個技巧只建議使用在后臺或很少工作的進程.
            ?經常使用這個函數會造成CPU負擔過重,磁盤交換文件的讀寫也會更頻繁.這樣會很影響進程的執行效率.
            ?其實不需要在意物理內存占用,如果物理內存不夠用,系統會自動降低不常工作的進程的物理內存.

            ?

            ?


            標 題: 答復
            作 者:dwing
            時 間:2005-12-28 17:05

            ?


            再補充幾點:


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

            ?

            ?這著我也經常用,不過我經常這么寫(只用于VC6.0):
            ?#pragma comment(linker,"/OPT:NOWIN98")
            ?但是如果要加壓縮殼的話,這個PE文件空間優化沒有一點作用,
            ?因為虛擬地址沒有改變(仍然是4KB,而且無法改變).
            ?


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

            ?

            ?對齊到16字節可能有兼容性問題,可能不能在Win9x中運行.
            ?


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

            ?

            ?如果沒有不加入默認庫的話可以不用自定義入口.
            ?而直接用void mainCRTStartup()或void WinMainCRTStartup()即可.
            ?但不使用默認庫可能某些浮點數的轉換會出現問題,雖然可以使用其他方法解決.
            ?


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

            ?

            ?這一項其實在默認的優化編譯設置中已經有了,不用寫出來.
            ?如果啟動"/OPT:REF"的話,"/OPT:ICF"默認會自動啟動.
            ?


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

            ?

            ?這項一定不要加,有時候如果資源不在某個節(段)的開始,程序的圖標可能不能顯示出來.

            ?

            ?


            標 題: 答復
            作 者:goldenegg
            時 間:2005-12-29 21:13

            ?

            ?


            引用:
            --------------------------------------------------------------------------------
            最初由 FlyToTheSpace 發布
            ?SetProcessWorkingSetSize
            ?這個我是跟蹤realplay里面一個程序realsched.exe
            ?發現的,其它減少內存用量的方法,還沒找到
            ?
            對于那些大一點的程序,就不能用settimer每隔段時間調用,
            ?........
            --------------------------------------------------------------------------------

            ?

            ?nono,不是大的程序自己搞的,是操作系統做的。
            ?在你的窗口最小化的時候,操作系統自動幫你把內存最小化了。
            ?所以,你自己就更沒有必要去調這個函數了。
            ?


            引用:
            --------------------------------------------------------------------------------
            最初由 dwing 發布
            ?
            呵呵,這就不一定了.目前如果沒有還在使用Win95系統的話,MFC的動態庫就可以大膽使用了.
            ?但要注意一定要使用MFC42.DLL的庫,也就是VC6.0自帶的庫,高版本的可能連WinXP也不會自帶.
            ?
            --------------------------------------------------------------------------------

            ?

            nono,mfc42.dll從win98se開始,到longhorn都是默認有的。vc6 mfc的程序,編成release就可以在每臺機器上跑了,不用到處拷個mfc42.dll

            ?

            ?


            標 題: 答復
            作 者:dwing
            時 間:2005-12-30 15:38

            ?

            ?


            引用:
            --------------------------------------------------------------------------------
            最初由 goldenegg 發布
            ?nono,mfc42.dll從win98se開始,到longhorn都是默認有的。vc6 mfc的程序,編成release就可以在每臺機器上跑了,不用到處拷個mfc42.dll
            ?........
            --------------------------------------------------------------------------------

            ?

            ?可能是對我的話理解有誤.我們的觀點是一樣的.
            ?再補充一下:
            ?Win95OSR2(Win97)雖然自帶msvcrt40.dll和mfc30.dll,但不是目前的標準庫了.
            ?Win98SE自帶了msvcrt.dll和mfc42.dll,Win98第一版不知有沒有.
            ?WinXP第一版肯定不帶msvcr71.dll和mfc71.dll,這些是VC7.1才使用的動態庫.

            精品久久人人做人人爽综合| 久久久久久亚洲精品成人| 国产精品99精品久久免费| 狠狠色丁香久久婷婷综合_中| 久久国产三级无码一区二区| 久久AAAA片一区二区| 狠狠久久综合伊人不卡| 久久国产视频99电影| 久久综合色之久久综合| 午夜精品久久久久成人| 久久久久久久久波多野高潮| 美女久久久久久| 囯产精品久久久久久久久蜜桃| 99精品久久久久久久婷婷| 麻豆亚洲AV永久无码精品久久| 99久久精品国产免看国产一区| 久久久久国产精品| 香蕉aa三级久久毛片| 国产成人精品久久| 色偷偷偷久久伊人大杳蕉| 国产韩国精品一区二区三区久久 | 久久久无码精品亚洲日韩按摩| 99精品久久精品一区二区| 国产福利电影一区二区三区久久老子无码午夜伦不 | 九九久久精品无码专区| 亚洲中文字幕伊人久久无码| 日日噜噜夜夜狠狠久久丁香五月| 精品久久久久久久| 亚洲欧美国产日韩综合久久| 青青草原精品99久久精品66| 中文字幕成人精品久久不卡| 伊人久久五月天| 色综合久久综精品| 亚洲成色www久久网站夜月| 国产精品午夜久久| 久久久噜噜噜久久熟女AA片 | 99久久国语露脸精品国产| 午夜精品久久久久9999高清| 久久国产精品-国产精品| 久久精品国产2020| 精品久久国产一区二区三区香蕉 |