4.7 복습 문제
1. 객체를 단순히 memcpy()하여 바이트 버퍼에 넣어 원격 호스트에 보내면 안전하지 않은 이유는 무엇인가?
2. 엔디언은 무엇인가? 직렬화할 때 엔디언을 신경 써야 하는 이유는 무엇인가? 데이터를 직렬화할 때 엔디언 관련 문제를 처리하는 방법을 설명해 보자.
3. 희소 자료구조를 효율적으로 압축하는 방법을 설명해 보자.
4. 포인터가 포함된 객체를 직렬화하는 두 가지 방법을 제시해 보자. 어떤 경우에 각 방법이 잘 들어맞을지 예를 들어 보자.
5. 엔트로피 인코딩이란 무엇인가? 그 사용 방법의 간단한 예를 들어 보자.
6. 부동소수점 숫자를 직렬화할 때 대역폭을 절약하는 방법으로 고정소수점으로 변환하는 방법을 설명해 보자.
7. 이번에 설명한 WriteBits() 함수가 리틀 엔디언 플랫폼에서만 제대로 동작하는 이유가 무엇인지 전체적으로 설명해 보자. 그리고 빅 엔디언에서도 잘 돌아가도록 고쳐 보자.
8. MemoryOutputStream::Write(const unordered_mapint, int&) 멤버 함수를 만들어 int에서 int로 매핑하는 map을 스트림으로 기록하는 기능을 구현해 보자.
9. 위에 대응하는 MemoryOutputStream::Read(unordered_mapint, int&)도 만들어 보자.
10. 문제 9번에서 작성한 MemoryOutputStream::Read() 구현을 템플릿화하여 임의의 템플릿형 tKey, tValue를 매핑하는 unordered_maptKey, tValue를 직렬화하게 개선하자.
11. 아핀 변환 행렬을 효율적으로 읽고 쓰는 Read()와 Write()를 구현하는 데, 스케일이 보통은 1이며, 1이 아닐 경우 적어도 유니폼하다는 특성을 활용해 보자.
12. 템플릿화한 Serialize() 멤버 함수를 개선하여 가상 함수에 의존하지 않고 템플릿으로 모두 처리하게 수정해 보자.