POD (Plain Old Data) — C++에서 데이터 구조 또는 데이터 타입으로, C에서의 일반적인 데이터 구조화와 호환되며 저수준 프로그래밍에 이상적입니다.
문맥 역사:
POD는 C 언어에서 메모리 호환성을 보장하기 위해 유래하였으며, C와 C++ 간의 호환성을 보장합니다. C++98에서 POD 객체는 바이트 단위로 쉽게 복사하거나 직접 직렬화할 수 있도록 강력한 제약이 있었습니다.
문제:
많은 프로그래머가 POD를 단순한 구조체와 혼동하고 표준의 세부 사항, 예를 들어 집합 규칙이나 비표준 생성자의 존재를 간과하는 경향이 있어 ABI 호환성과 저수준 작업(memcpy, 직렬화)에 있어 치명적인 문제가 생깁니다.
해결책:
현대 C++ (C++11)에서는 trivial, trivially copyable 및 standard-layout 개념이 도입되어 요구 사항이 보다 명확하게 구분되었습니다.
코드 예:
struct PODType { int x; double y; }; static_assert(std::is_pod<PODType>::value, "Must be POD"); static_assert(std::is_trivially_copyable<PODType>::value, "Trivially copyable"); static_assert(std::is_standard_layout<PODType>::value, "Standard layout");
주요 특징:
비공식 멤버로 POD 타입을 만들 수 있습니까?
아니요, standard-layout은 모든 멤버가 public이거나 동질 접근이 있어야 합니다 (모두 public이거나 모두 private/protected이어야 함).
명시적으로 본체가 없는 사용자 정의 생성자가 있는 클래스는 POD 타입이 될까요?
아니요, 비어 있는 사용자 정의 생성자가 있으면 타입이 POD가 아니며 트리비얼하지도 않습니다.
가상 소멸자 또는 가상 메소드를 가진 POD 타입을 사용할 수 있나요?
아니요, 가상 메소드는 타입을 POD 및 standard-layout이 아니게 만듭니다.
부정적 사례
개발자가 구조체를 memcpy로 직렬화하면서 내부에 std::string (비POD) 로 인한 오류를 간과하여 읽을 수 없는 데이터가 됩니다.
장점:
단점:
긍정적 사례
전체 구조체가 POD 혹은 trivial일 때, memcpy로 직렬화하고 내부에 참조나 std 컨테이너가 없습니다.
장점:
단점: