반응형
링버퍼 구현체를 찾아보면, 다양한 방법들로 구현이 되어 있다.
이미 하이레벨 언어에서는 기본적으로 지원해주기에, 직접 구현해서 쓸 일을 별로 없는 것
단일 배열로 구현한 형태를 기준으로
_HEAD와 _TAIL을 가리키는 포인터 형태가 일반적이다.
- HEAD는 PUT할 위치를 가르킨다.
- TAIL은 GET할 위치를 가르킨다.
그러면, 내부 멤버변수는 배열, HEAD, TAIL 총 3개, 여기에 SIZE 를 추가하면 총 4개다.
데이터의 크기를 담을 SIZE 변수가 있으면, 비거나, 꽉찬 상태를 체크하기가 쉽다.
SIZE변수가 없는 경우는 어떨까??
HEAD와 TAIL로 사이즈를 구하는 것은 불가능 하다. 비었을 경우나, 꽉찬 경우 모두 HEAD == TAIL이 성립하기 때문이다.
이것을 해결한 구현방법은 배열 생성시, 사용할 크기보다 +1 한 크기로 배열을 만들어서, 구현했다.
이것은 아래 조건을 만족한다.
- HEAD + 1 == TAIL 이거나, TAIL == 0 이고, HEAD == 버퍼크기이면, 꽉찬 상태
- HEAD == TAIL 이면, 빈 상태
- HEAD가 가르키는 위치는 항상 비어있다. (+1 시킨 배열위치가 사용됨)
전자나 후자나, 사실, 별다른 이점은 없다.
성능적인 부분은 거의 미비하며
멤버변수 Int(4바이트)보다 1개 더 들어갈 배열의 메모리 사용량 또한, 미비하다.
반응형
'dev' 카테고리의 다른 글
비트연산시 실수 (0) | 2017.05.10 |
---|---|
콜백 (0) | 2017.05.06 |
버퍼풀 (0) | 2017.05.05 |
IO(input/output) model (0) | 2017.04.03 |
Modern Data Binding (0) | 2017.03.14 |