我有一個專案,當我的程式啟動時,我必須在其中分配 1024 個位元組。在 C 程式中。
void* available = new char*[1024];
我寫這個,我覺得沒問題。現在我的問題開始了,我應該創建一個函式來接收我應該分配的 size_t 大小(位元組數)。我的分配應該回傳一個 void* 指標,指向這個可用記憶體的第一個位元組。所以我的問題是如何分配具有大小的 void* 指標并從可用的記憶體中獲取記憶體。
我是一名學生,我不是 C 專業人士。也很抱歉我的錯誤解釋。
uj5u.com熱心網友回復:
看起來您正在嘗試創建記憶體池。盡管這是一個很大的話題,但讓我們來看看您可以為創建這樣的東西付出的最小努力是什么。
游泳池有一些基本要素需要掌握。首先是記憶體本身,即你從哪里提取記憶體。在您的情況下,您已經決定要動態分配固定數量的記憶體。要正確地做到這一點,代碼應該是:
char *poolMemory = new char[1024];
我沒有選擇void* pool這里是因為當 pool 是一個 void 指標時delete[] pool是undefined。你可以去,malloc/free但我會保留它 C 。其次,我沒有像您的代碼所示分配指標陣列,因為它分配1024 * sizeof(char*)了記憶體位元組。
第二個考慮因素是如何歸還您為池獲得的記憶體。在你的情況下,你想記住洗掉它,所以最好把它放在一個班級中為你做 RAII:
class Pool
{
char *_memory;
void *_pool;
size_t _size;
public:
Pool(size_t poolSize = 1024)
: _memory(new char[poolSize])
, _pool(_memory)
, _size(poolSize)
{
}
~Pool() { delete[] _memory; } // Forgetting this will leak memory.
};
現在我們來到你要問的部分。您想使用該池中的記憶體。在被Pool呼叫的類中創建一個方法,該方法allocate將回傳 n 個位元組。該方法應該知道池中剩余多少位元組(成員_size),并且本質上執行指標運算以讓您知道哪個位置是空閑的。不幸的是有捕獲。您必須提供結果記憶體應具有的所需對齊方式。這是另一個大話題,從我認為您無意處理的問題來看。
#include <memory>
void* Pool::allocate(size_t nBytes, size_t alignment = 1)
{
if (std::align(alignment, nBytes, _pool, _size))
{
void *result = _pool;
// Bookkeeping
_pool = (char*)_pool nBytes; // Advance the pointer to available memory.
_size -= nBytes; // Update the available space.
return result;
}
return nullptr;
}
我使用了這個指標演算法,std::align但我想你可以手工完成。在現實世界的場景中,您還需要一個deallocate功能,在使用后“打開”池內的點。當池記憶體不足時,您還需要一些策略,即回退分配。此外,通過使用靜態記憶體,初始記憶體獲取可以更有效。這有很多風格和方面,我希望我包含的初始鏈接能給你一些研究這個主題的動力。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/386144.html
