์ง๋๋ฒ์ ๊ณต๋ถํ ๋ด์ฉ์ ๋ฐํ์ผ๋ก ๊ฐ๋จํ ๋ฉ๋ชจ๋ฆฌ ํ์ ๋ง๋ค์ด ๋ณด์์ต๋๋ค.
#pragma once
#include <iostream>
#include <vector>
#include <cassert>
class CMemoryPool
{
private:
size_t m_blockSize;
size_t m_blockCount;
std::vector<char> m_pool; // ๋ฉ๋ชจ๋ฆฌ ํ
std::vector<void*> m_freeBlocks; // ํ ๋น ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์
public:
CMemoryPool(size_t _blockSize, size_t _blockCount)
: m_blockSize(_blockSize)
, m_blockCount(_blockCount)
{
m_pool.resize(m_blockCount * m_blockSize);
for (size_t i = 0; i < _blockCount; ++i)
{
m_freeBlocks.push_back(&m_pool[i * m_blockSize]);
}
}
void* allocate()
{
// ๋ ์ด์ ํ ๋น ๋ถ๊ฐํ๋ฉด nullptr ๋ฐํ
if (m_freeBlocks.empty())
return nullptr;
void* block = m_freeBlocks.back();
m_freeBlocks.pop_back();
return block;
}
void deallocate(void* _block)
{
// _block์ ์ฃผ์๊ฐ m_pool์ ๋ฒ์ ๋ฐ์ด๋ฉด ๊ฒฝ๊ณ
assert(_block >= m_pool.data() && _block < m_pool.data() + m_pool.size());
// m_pool์ ์ฃผ์ ~ _block์ ์ฃผ์ ํฌ๊ธฐ๊ฐ m_blockSize๋ก ๋๋ ๋จ์ด์ง์ง ์์ผ๋ฉด ๊ฒฝ๊ณ
assert(0 == ((char*)_block - m_pool.data()) % m_blockSize);
// ๋ฐํ
m_freeBlocks.push_back(_block);
}
};
๋ฉ๋ชจ๋ฆฌ ํ์ ์ฌ์ฉํ์ ๋์ ๋ฉ๋ชจ๋ฆฌ ํ์ ์ฌ์ฉํ์ง ์๊ณ malloc์ ์ด์ฉํ์ฌ ํ ๋น ํ์ ๋ ์๋ ์ฐจ์ด๋ฅผ ๋น๊ตํด๋ณด์์ต๋๋ค.
๋ฉ๋ชจ๋ฆฌ ํ์ ์ฌ์ฉํ์ ๋ ํ ๋น ์๊ฐ์ด ๋๋ต 2๋ฐฐ ์ ๋ ๋น ๋ฅธ ๊ฒ์ ํ์ธํ ์ ์์์ต๋๋ค.
https://github.com/beankong-github/MemoryPool
ํ ์คํธ ์ฝ๋๋ ๊นํ๋ธ์์ ํ์ธํ ์ ์์ต๋๋ค.
'๐ฅ๏ธ Study Note' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฉ๋ชจ๋ฆฌ ๋จํธํ์ ํด๊ฒฐ ๋ฐฉ๋ฒ (0) | 2023.04.05 |
---|