더북(TheBook)

4.3.1 임베딩(또는 인라이닝)

멤버 변수 중에는 자신이 참조하는 데이터를 다른 객체와 공유하지 않는 것이 있다. RoboCatmMiceIndices가 그 예제이다. 이 변수는 RoboCat이 추적하는 쥐들의 정수 인덱스를 vector에 담아 둔 것인데, std::vectorint는 블랙박스이므로 표준 OutputMemoryStream::Write() 함수를 써서 std::vectorint의 메모리 주소를 스트림에 복사해 넣으면 위험하다. 이렇게 하면 std::vector 안의 여러 포인터 값들을 무턱대고 직렬화해버려, 원격 호스트에서 복원하면 쓰레기 값을 가리키는 포인터가 되어버린다.

vector를 통째로 직렬화하기보다는, 커스텀 직렬화 함수를 작성해 vector에 저장된 데이터만 기록하게 해야 한다. 이 데이터의 실제 RAM상 위치는 RoboCat이 저장된 위치에서 멀리 떨어진 곳일 가능성이 크다. 하지만 커스텀 함수는 이 데이터를 스트림상 RoboCat의 다른 데이터와 연이어 중간에 박아 넣는데, 이렇게 독립적인 데이터를 다른 데이터 중간에 끼워 넣는 것을 임베딩(embedding) 또는 인라이닝(inlining)이라 한다. 예를 들어 std::vectorint32_t를 직렬화하는 커스텀 함수를 작성하면 다음과 같은 형태가 된다.

void Write(const std::vector<int32_t>& inIntVector)
{
    size_t elementCount = inIntVector.size();
    Write(elementCount);
    Write(inIntVector.data(), elementCount * sizeof(int32_t));
}

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