더북(TheBook)

벡터를 직렬화할 때와 마찬가지로 데이터 본체를 기록하기에 앞서 그 길이부터 기록하는 것에 주목하자. 수신자가 스트림에서 얼마나 데이터를 읽어야 할지 알려주려는 의도이다. 문자열의 길이를 구해(0~255 사이의 값을 담을 수 있는) 바이트 하나로 만들어 직렬화하는데, 본 예제에선 배열이 최대 128 문자까지 기록할 수 있기 때문에 일단은 안전하다.

사실 RoboCat의 데이터 중 이름 필드는 다른 것보다 자주 읽거나 쓸 필요가 없는 편이다. 그러므로 캐시 적중률 관점에서 최적화를 위해 객체의 이름을 std::string 같은 것으로 표현하는 게 훨씬 효율적이다. 그러면 128바이트 공간을 차지해야 할 때보다 캐시 메모리의 적은 분량만 차지하면 되므로 캐시 적중률이 높아질 것이다. 이렇게 하려면 std::string을 앞서 vector에 했던 것처럼 따로 직렬화해 주는 코드를 만들어 mName을 처리할 때 이 함수를 호출하면 된다. 본래 이렇게 하는 것이 맞겠지만, 이 예제에선 이해하기 쉽도록 일부러 128바이트 길이 배열에 넣은 의도도 있긴 하다. 실무에선 이처럼 내용을 다 채우지 못하는 컨테이너 같은 것들이 쉽게 건질 수 있는 최적화 대상이므로 압축하는 것을 고려해 보자.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.