記憶體對映檔案例項——dll
動態庫的好處在前面說過,可以動態呼叫,節約記憶體空間,以及動態的改變dll而不需要重新編譯我們呼叫dll 的客戶端程式。
動態的庫的呼叫有2中方式,一種是顯式的一種隱式的,這裡我只考慮顯式的,隱式的呼叫跟靜態庫的呼叫類似,需要提供宣告檔案和庫檔案(lib)所以我們在隱式呼叫dll 的時候需要提供dll 的匯出函式的宣告標頭檔案。
由於隱式呼叫很簡單,為了防止以後忘記顯式dll的呼叫,這裡我只討論隱式的呼叫:
首先我們要呼叫dll 是因為需要dll 提供一些功能,這些功能是通過一些函式來實現的,但是並不是所有的函式都是可以呼叫的,根據前面說的應該是得到類似如unmapviewoffile返回的指標,所以在dll 中我們必須告訴客戶有哪些函式是匯出的,也就是映**那些函式的指標,這dll 中我們可以通過關鍵字:_declspec(dllexport),最好加上extern "c",所以一般來說是通過關鍵字:extern "c" _declspec(dllexport) 來表明該函式是匯出的。當然也可以通過def檔案在指明哪些函式是匯出的,一直沒用過def檔案,所以以後也應該不會用def 檔案。
dll檔案的實現完成了,然後就是客戶怎麼呼叫dll 檔案了。
當然有一點沒說就是dllmain,如果我們在dll中實現了dllmain那麼我們在載入dll 的時候就會首先呼叫dllmain完成一些初始化工作。
下面來看乙個例子,來自《inside com》第7章的元件註冊: //
// server registration //
stdapi dllregisterserver()
// // server unregistration //
stdapi dllunregisterserver()
/// //
// dll module information //
bool apientry dllmain(handle hmodule,
dword dwreason,
void* lpreserved)
return true ; }
上面的stdapi是 hresult extern"c" _stdcall 的組合,apientry 是_stdcall 當然這裡沒有_declspec(dllexport),這是因為它在def檔案中表明了這些函式是匯出的。
3記憶體管理
3.2.2 交換技術 3.2.3 空閒記憶體管理 3.3 虛擬記憶體 帕金森定律 不管儲存器多大,程式都可填滿它 這章討論os怎樣對儲存器建立抽象模型 os的工作是將這個儲存體系抽象為乙個有用的模型並管理這個抽象模型。至於永久性儲存器 磁碟 的抽象和管理,是下章主題 從最簡單的管理方案討論,逐步深入...
Linux記憶體管理 3
我們希望能通過訪問使用者空間的記憶體達到讀取核心資料的目的,這樣便可進行核心空間到使用者空間的大規模資訊傳輸。具體的講,我們要利用記憶體對映功能,將系統核心中的一部分虛擬記憶體對映到使用者空間,從而使得使用者空間位址等同與被對映的核心記憶體位址。核心空間記憶體分配介紹 因此我們將試圖寫乙個虛擬字元裝...
記憶體管理(3) 如何優化記憶體使用
為優化應用記憶體使用,開發人員首先應該知什麼最耗應用記憶體,答案就是紋理!紋理幾乎會佔據90 應用記憶體。所以盡量最小化應用的紋理記憶體使用,否則應用很有可能會因為低記憶體而崩潰。本文介紹cocos2d x遊戲通用的兩條記憶體優化原理指導。什麼樣的紋理最耗應用記憶體?或這些紋理會消耗多少記憶體?當然...