메모리 풀을 쓰는 이유 : 메모리 할당 / 해제를 요청하면 시스템 콜이 발생된다.
1. 미리 큰 메모리를 할당 / 해제하는 기능
2. 미리 할당한 큰 메모리에서 원하는 크기 만큼 할당 / 해제하는 기능( - 여기까지 기본적인 chunk의 기능들)
3. 큰 메모리가 더 필요할 수 있으므로, 이러한 큰 메모리르 관리하는 기능(복수운용)
1번 보면 미리 큰 메모리를 할당하는 방법은 큰 메모리에서 작은 메모리로 쪼개는 방법에 따라서 할당 방법이 달라진다라..
고정크기냐, 원하는 크기냐인데..대부분은 고정크기로 한다 왜냐면. 복잡하지 않으니까.
고정블럭단위라는 장점..하지만 사용률이 높지않아 낭비되는 메모리도 있다는거..
chunk.hpp1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 | #pragma once;
#include <assert.h>
class Chunk
{
public :
Chunk(std:: size_t block_size, unsigned char blocks)
{
prough_data_ = NULL;
first_useable_block = 0;
useable_block_count = 0;
if (0 == block_size)
return ;
if (0 == blocks)
return ;
prough_data_ = new unsigned char [block_size * blocks];
first_useable_block = 0;
useable_block_count = blocks;
unsigned char i = 0;
while (i < blocks)
{
unsigned char *p = &prough_data_[i * block_size];
*p = ++i;
}
}
~Chunk()
{
delete prough_data_;
}
public :
void * alloc(std:: size_t block_size)
{
if (0 == useable_block_count)
return 0;
unsigned char *prough_block = &prough_data_[block_size * first_useable_block];
first_useable_block = *prough_block;
--useable_block_count;
return prough_block;
}
void delloc( void *pdelloc_target, std:: size_t block_size)
{
assert (0 != block_size);
assert (prough_data_ <= pdelloc_target);
unsigned char *to_release = static_cast <unsigned char *>(pdelloc_target);
assert (((to_release - prough_data_) % block_size) == 0);
*to_release = first_useable_block;
first_useable_block = (to_release - prough_data_) / block_size;
++useable_block_count;
}
bool is_useable()
{
return 0 != useable_block_count;
}
bool is_has( void *p, std:: size_t block_size, std:: size_t block_num)
{
unsigned char *ptarget = static_cast <unsigned char *>(p);
if (prough_data_ > ptarget)
return false ;
if (&prough_data_[block_size * block_num] <= ptarget)
return false ;
return true ;
}
private :
unsigned char *prough_data_;
unsigned char first_useable_block;
unsigned char useable_block_count;
};
|
101번 줄의 비교는 메모리 주소 비교다
ptarget이라는 메모리 주소를 prough_data랑 메모리 주소를 비교하는데..
이건 모두 힙공간에 있어서 메모리 주소가 작 -> 큰으로 간다.
아 ..prough_data가 가리키는 것은 메모리의 첫번째 주소이다....큰 메모리를 하당하고 메모리의 첫번째 주소를 가지고 있지..ㅠㅠ아휴
그러니까 저기서 false인 이유는..메모리 주소가 결국 힙이니까 작 -> 큰 인데 작이 더 크다는건 더 작다는거니까 저기에 포함이 안되지..false