POD (Plain Old Data)
메모리 상에서 연속적인 바이트 열이다. 다형성이나 유저가 정의한 복사 의미론 등과 같은 진보된 의미론 문법이 필요없을 때 개체를 POD로 취급해야 할 때가 있다. 왜냐하면, POD로 취급하면 하드웨어에서 좀 더 효율적으로 개체를 옮기거나 복사할 수 있기 때문이다.
POD 개체는 다음 조건을 갖춰야 한다.
- 표준 레이아웃 타입(standard layout type)이어야 한다.
- 간단한 타입(trivial type)이어야 한다.
POD가 될 수 있는 조건
- 복잡한 레이아웃을 갖지 않는다.(가상 함수 등)
- 유저가 정의한 복사 의미론을 갖지 않는다.
- 간단한 기본 생성자를 갖고 있다.
<type_traits>의 std::is_pod를 이용하면 쉽게 알 수 있다.
표준 레이아웃 타입
C와 분명하게 같은 레이아웃을 갖고 있는 타입이며, 공통 C++ ABIs(Apllication Binary Interfaces)가 다룰 수 있는 타입이다.
다음의 특성을 가진다.
- 가상 함수나 가상 기저 클래스를 갖지 않는다.
- 비정적 데이터 멤버가 동일한 접근 제어를 가진다.
- 모든 비정적 데이터 멤버가 표준 레이아웃이다.
- 모든 기저 클래스가 표준 레이아웃이다.
- 첫번째 비정적 멤버로 기저 클래스와 동일한 타입의 데이터를 갖지 않는다.
- 레퍼런스 멤버를 갖지 않는다.
- 한 개 이상의 기저 클래스 혹은 파생 및 기저 클래스 둘 다에서 비정적 데이터를 갖지 않는다.
<type_traits>의 std::is_standard_layout을 이용하면 된다.
간단한 타입
(1)간단한 기본 생성자 및 소멸자와 (2)간단한 복사 및 이동 연산을 갖고 있는 타입이다. 다르게 말하면, 비트 단위 연산들이 가능하면 된다.
복사, 이동, 소멸자가 간단하지 않은 경우는 다음과 같다.
- 유저가 정의한 것이다.
- 그 클래스가 가상 함수를 가진다.
- 그 클래스가 가상 기저 클래스를 가진다.
- 그 클래스가 간단하지 않은 멤버나 기저 클래스를 가진다.
<type_traits>의 std::is_trivial을 이용하면 쉽게 확인할 수 있다.
struct S0 { }; // POD
struct S1 { int i; }; // POD
struct S2 { int i; S2(int ii) : i(ii) { } }; // 기본 생성자가 없으므로 POD가 아니다
struct S3 { int i; S3(int ii) : i(ii) { } S3() {} }; // POD
struct S4 { int i; S4(int ii) : i(ii) { } S4() = default; }; // POD
struct S5 { virtual void f(); }; // 가상 함수가 있으므로 POD가 아니다
struct S6 : S1 { }; // POD
struct S7 : S0 { int b; } // POD
struct S8 : S1 { int b; } // 기저 클래스에 비정적 멤버가 있으므로 POD가 아니다.
struct S9 : S0, S1 { }; // POD
'프로그래밍 언어 > C++' 카테고리의 다른 글
C++ 친구 클래스 및 함수 (friend) (0) | 2022.07.20 |
---|---|
C/C++ 연산자(Operator) 정리표 (비트, 논리, 산술 +=&^<<>>%~!) (0) | 2022.07.10 |
C++ namespace와 using (0) | 2022.07.05 |
C/C++ 전처리기의 모든 것 (예외, 매크로, 토큰) (0) | 2022.07.04 |
C++ 연산자 오버로딩 (0) | 2022.07.02 |