C++에서 모든 객체는 일련의 바이트로 표시되며 모든 유형의 객체는 바이트 배열로 재 해석 될 수 있습니다. 이것은 정확히 fwrite
이라고 할 때 일어납니다. 객체에 대한 포인터를 지정하고 객체의 크기가 얼마나되는지를 알려주고 객체를 해당 바이트의 배열로 재 해석합니다.
유형이 POD인지 여부는 중요하지 않습니다. non-POD 타입의 객체는 바이트 배열로도 재 해석 될 수 있습니다. 비 POD 유형의 객체를 바이트 배열로 재 해석하는 것에 대한 정의가 없습니다. (결과는 대부분 POD가 아닌 유형에 대해 구현에 따라 정의되지만, 다른 문제입니다.)
POD가 아닌 유형의 객체에 대한 문제점은 기본 저장 영역의 사본을 예를 들어, fwrite
을 사용하거나 메모리의 다른 위치로 복사하는 경우) 사본으로 할 수있는 일이 많지 않습니다. fread
복사본을 메모리에 다시 저장할 수없고 원래 개체 인 것처럼 사용할 수 있으며 원래 개체 유형의 개체 인 것처럼 바이트 복사본을 다시 해석 할 수 없습니다.
클래스가 POD 클래스 인 경우에도 포인터 유형의 데이터 멤버가있는 클래스에서 비슷한 문제가 발생합니다. 포인터가 가리키는 객체가 아닌 포인터의 값만 복사했기 때문에 ' 실제로 필요한 모든 데이터를 복사했습니다. 파일에서 복사 된 데이터를 의미있는 방법으로 읽을 수는 없습니다. 실제 오브젝트를 참조하지 않는 포인터로 끝나기 때문입니다. 실제로는 의도하지 않습니다.
다른 사람들은 자기가 포함 된 POD 유형의 객체를 가지고 있어도 이런 식으로 파일을 이식 할 수는 없으며 다른 플랫폼에서 올바르게 읽을 수 있기를 기대할 수 있습니다. 기본 유형의 크기와 표현의 차이, 데이터 구조 패딩 (padding)과 정렬 (alignment)과 같은 구현 정의의 다른 것들.
왜 보지 않습니까? :) – fingerprint211b
b/c 표준에 의해 허용되는 것이 있으면 휴대용 컴퓨터에서 시도 할 수 있습니까? –
이 방법은 이식 가능하지만 작성된 내용이 플랫폼간에 일치하지 않아야합니다. –