개발 노트 string 및 assert 2018/12/24 23:47 by cagetu

* String

작업 중(or 작업 한) Container 들에 이어서 string 클래스를 보고 있다. 오픈소스 게임엔진을 많이 살펴보고 특징들을 보니까 꽤 재밌다. Unreal, irright, neblua3, oryol 등을 좀 찾아봤다.

기본적으로 unreal, irright 은 allocator를 기반으로 스트링 사용량 만큼 메모리를 할당하는 방식이다. 언리얼은 TArray를 그대로 사용해서 만들었다. Nebula3는 좀 재밌는데, char localbuffer[20];를 가지고 있어서, 아주 작은 할당에 대해서는 heap 할당이 되지 않도록 구현했다. fbstring도 이런 방식으로 메모리를 조금 더 보유하도록 해서 메모리 할당이 빈번해지지 않도록 하는 최적화를 했다고 알고 있다. (small 인지 확인하는 flag). oryol은 nebula를 만든 개발자가 새롭게 진행하는 프로젝트인데, string을 복사할 때 재할당이 일어나지 않도록 포인터로 참조하도록 한 후 레퍼런스 카운터로 다른 객체가 삭제될 때, 같이 사라지지 않도록 하였다. 빈번하게 스트리객체게 복사된다고 생각해보면 되게 경재적인 방법으로 보인다. (물론 쓰레드 등에서는 어찌할지 ...)

또 언리얼의 FName 같이 StringId 객체도 필요한데, HashCode로 변환되어서 빠른 비교가 필요할 때 사용하게 된다. 

나는 irright 코드를 기반으로 사용해보기로 하고, 아래와 같은 이름으로 정의하였다.

template<class T> basestring;
namespace unicode
{
typedef basestring<char> utf8;
typedef basestring<wchar> string;
}

16 정도의 localbuffer를 사용하는 것이 효과가 좋지 않을까? 하고 적용해 볼 예정이다. (nebula3 참고)

* Assertion Macro


스킵 가능한 메크로에 대한 소개이다. 프로그래머가 적용한 Assert 때문에, 사용자 (디자이너, 아티스트 등)이 작업이 멈추는 상황이 생기지 않도록 Assert를 만들자는 내용이다. Assert를 통해서 최대한 많은 정보를 서버로 보내서 프로그래머는 코드 수정을 할 수 있는 정보를 취합하고, ASSERT가 true/false를 반환하도록 하여 skip 가능하도록 하자는 의견이다.

* Memory 할당자

tcmalloc, jemalloc, nedmalloc 등의 메모리 할당 라이브러리가 있다. jemalloc은 언리얼에 통합되어 있고, 옵션으로 사용이 가능하다. nedmalloc은 orge3D에 적용되어 있다. 설명을 보면 멀티 쓰레드 환경에서 효과가 좋을 것 같은데, 아직 판단이 서지 않는다. 아직은 멀티 쓰레드 환경에 익숙하지 않아서 더 그런 듯... 기억해 두었다가 나중에 적용해봐야지...

오늘은 여기까지~.


덧글

댓글 입력 영역



메모장

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

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

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