여기에 게시 된 이유 외에도 다른 이진 호환성도 있습니다. 라이브러리 작성자 std::string
는 사용 중인 구현과 동일한 메모리 레이아웃을 갖는지 여부를 제어 할 수 없습니다 .
std::string
는 템플릿이므로 구현은 로컬 STL 헤더에서 가져옵니다. 이제 표준과 완전히 호환되는 일부 성능 최적화 STL 버전을 로컬에서 사용한다고 가정 해보십시오. 예를 들어, std::string
동적 할당 및 캐시 누락 수를 줄이기 위해 각각 정적 버퍼를 도입하도록 선택했을 수 있습니다 . 결과적으로 구현의 메모리 레이아웃 및 / 또는 크기는 라이브러리와 다릅니다.
레이아웃 만 다른 경우 std::string
라이브러리에서 클라이언트로 전달 된 인스턴스 또는 다른 방식으로 전달 된 인스턴스 에서 일부 멤버 함수 호출은 실패한 멤버에 따라 실패 할 수 있습니다.
크기도 다르면 std::string
멤버 및 라이브러리가 클라이언트 라이브러리에서 체크인 될 때 멤버가있는 모든 라이브러리 유형의 크기가 다른 것으로 나타납니다. 멤버 다음에 오는 데이터 멤버 std::string
도 오프셋이 이동하며 라이브러리 자체를 디버깅 할 때 "확인"으로 표시되지만 클라이언트에서 호출 된 모든 직접 액세스 / 인라인 접근자는 쓰레기를 반환합니다.
결론-라이브러리와 클라이언트 코드가 다른 std::string
버전으로 다시 컴파일 되면 제대로 링크되지만 버그를 이해하기가 어려울 수 있습니다. std::string
구현 을 변경하면 STL에서 멤버를 노출시키는 모든 라이브러리를 클라이언트의 std::string
레이아웃 과 일치하도록 다시 컴파일해야 합니다. 또한 프로그래머는 라이브러리가 견고하기를 원하기 때문에 거의 std::string
어디에도 노출 되지 않습니다 .
공평하게 말하면, 이것은 모든 STL 유형에 적용됩니다. IIRC에는 표준화 된 메모리 레이아웃이 없습니다.