1
我想我的緩存庫移動到一個DLL,並允許多個應用程序共享使用的GlobalAlloc DLL中分配的單一指針()。我怎麼能做到這一點,並會導致顯着的業績下降?共享的GlobalAlloc()內存從DLL到多個Win32應用程序
我想我的緩存庫移動到一個DLL,並允許多個應用程序共享使用的GlobalAlloc DLL中分配的單一指針()。我怎麼能做到這一點,並會導致顯着的業績下降?共享的GlobalAlloc()內存從DLL到多個Win32應用程序
你當然可以這樣做,不會有單個指針任何性能含義。
而不是使用GlobalAlloc
,舊的API,你應該選擇不同的共享堆。例如最簡單的使用是COM分配器,CoTaskMemAlloc
。或者您可以使用HeapAlloc
傳遞由GetProcessHeap
獲得的進程堆。
例如,忽視顯示錯誤檢查:
void *mem = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size);
請注意,您只需要,如果你希望在內存中,從它被創造,其中不同的模塊被釋放擔心堆共享。如果你的DLL既創建並破壞了內存,那麼你可以使用普通的舊版本malloc
。由於所有模塊都位於同一個進程地址空間中,因此該進程中的任何模塊分配的內存都可供任何其他模塊使用。
更新
我沒有對這個問題的一讀挑上你可能會想多進程訪問相同的內存的可能性。如果這就是你所需要的,那麼它只能用內存映射文件,或者用某種形式的IPC。
您是否希望在使用DLL的所有獨立進程之間直接共享內存?堆API不會那樣做,因爲它們分配每個進程的內存。要在進程之間共享內存,您需要使用[使用文件映射API的共享內存](http://msdn.microsoft.com/en-us/library/windows/desktop/aa366551(v = vs.85) .aspx)(不需要實際的文件)。請注意,雖然每個進程都會得到相同的內存,但內存可能會以不同的地址結束,因此您將擁有不同的指針值。 – BrendanMcK