개발 노트 작업 중(or 작업 한) Container 들 2018/04/09 18:26 by cagetu

작성해보면서 UnrealEngine4, Oryol, Nebula3, OurMachinery, bitsquid Foundation, FacebookLib, eastl 등을 많이 참고하고 있다...

* Array
: Custom Array에서 적은 내용이지만, UE4의 TArray 80: Oryold의 Array 20 정도의 내용을 참고해서 작성했다. 특히, UE4의 AddUninitialized 등이 마음이 들었다. Allocator 관련해서는 간단하게 Allocator 객체를 이용했다. 기본적으로 Array에서는 그냥 HeapAllocator가 사용된다. 추후에 PoolAllocator 정도를 매핑할 수 있으려나?? (UE4 보면 다른 Allocator를 사용하는 경우는 별로 없는 듯...)

* InlineArray
* FixedArray (StaticArray)
: UE4에서는 TArray<int32, TInlineAllocator<16>> 이런 형태로 사용하는데, 내부적으로 int32 InlineData[16] 배열로 잡고 시작해서 heap 없이 기본 배열 메모리를 사용하다가 너 많은 할당을 원하면, HeapAllocator를 이용해서 확장해주도록 한다. FixedArray는 TArry<int32, TFixedAllocator<16>> 으로 사용되는데, int32 ElementData[16] 으로 설정되고 더 이상 확장되지 않도록 된다. oryol에서 InlineArray가 ue4의 FixedArray와 동일하게 고정 크기만 지원한다. Allocator를 여러 개로 할 것인가? Array를 메모리 할당 형태에 맞게 구분해서 만들어줄 것인가? 를 결정해야 한다.

나는 InlineAllocator를 작성해서 사용하는 것이 조금 더 세련되어 보이지만 복잡도가 조금 더 올라가는 것 같기도 하다. UE4에서도 TSet과 TArray에서만 사용하는 것으로 봐서 oryol처럼 InlineArray를 만들고, 고정 크기 대신 HeapAllocator로 확장할 수 있도록 작성하는 것이 조금 더 직관적이지 않나 생각해본다. 

> Map / Set을 Array 기반으로 작성하다보니, InlineAllocator를 연동할 수 있으면 Map / Set에도 활용할 수 있을 것 같아서, InlineArray -> InlineAllocator 작성해보고 있다. Allocator를 어떻게 다루느냐? 도 큰 공부가 되고 있다.

* BitArray

* Map
이번에는 Map이닷!!!, LowerBound / UpperBound에 대한 소개 글처럼 LowerBound + Array를 기본적으로 사용한다. 이건 oryol / nebula3 등의 map 구현 형태를 보고 작성해본 것이다. eastl::map이 stl::map 과 동일하게 R-B Tree로 구현되어 있지만, insert할 때 "생성 -> 시도 -> 삭제"가 아니라, "검색 -> 성공 -> 생성" 형태로 되어 있는 것이라 나쁘지 않을 것 같다. 아마 eastl::map과 custom map을 혼용해서 사용하면 되지 않을까???

* Set
: Set은 정렬된 형태로 검색이 가능하도록 한다. UE4에서는 TSetAllocator가 별도로 존재한다. 내부까지 명확히 보지는 않았지만, 문서를 보면 FreeList 처럼 관리하여 재활용 할 수 있도록 되어 있다고 한다. 이 정도까지는 아니고 기본적으로 Map과 같이 LowerBound + Array를 이용하여 작성하였다. 별도 Allocator를 생각하지는 않았다.

* Template::Move
* Template::Forward
: && 계열에 대한 공부가 많이 부족해서, 겸사 겸사 Template 도 그냥 같이 보고 있다.

* Algorithm::BinearySearch
* Algorithm::UpperBound
* Algorithm::LowerBound
http://ohyecloudy.com/pnotes/archives/330/ 소개한 내용처럼 순서가 보장되면서 검색을 하기 위한 알고리즘이다. Map을 작성할 때, stl 처럼 tree 구조를 사용하지 않고, Array + LowerBound로 구현할 때 사용했다. 알고리즘은 간단하지만 만들어본다는 것에 의의를 둔다.

* Allocator::MallocAllocator
* Allocator::LinearAllocator
* Allocator::StackAllocator
* Allocator::ScopeStackAllocator
 

덧글

댓글 입력 영역



메모장

내가 먼 훗날에 이 글들을 보았을 때, 좋은 추억이 될 수 있기를...

나를 위해... 나에게 쓰는...

msn: cagetu@hotmail.com
mail: cagetu79@gmail.com
twitter: twitter.com/cagetu
facebook: facebook.com/cagetu