본문 바로가기

Language/C++

POD / Standard Layout Type / Trivial Type

POD(Plain Old Data) 


메모리 상에서 연속적인 바이트열을 뜻한다.

실행시간 다형성이나 유저가 정의한 copy constructor등과 같은 진보된 constructor 문법이 필요없을때 객체를 POD로 취급한다.

POD로 취급하게되면 하드웨어에서 좀더 효율적으로 객체를 옮기거나 복사할 수 있다.

즉 POD는 class layout이나 user가 정의한 constructor, copy, move constructor등의 복잡성에 대한 고려없이 data 자체로 취급할 수 있는 객체이다.


POD객체는 다음 조건을 갖춰야 한다.


표준 레이아웃 타입(Standard layout type)이어야 한다.

간단한 타입(Trivial type)이어야 한다.



Standard layout type


기본적으로 standard layout type은 C와 분명하게 같은 layout을 갖고있는 type이며 common C++ ABIS(Application Binary Interfaces)가 다룰 수

있는 type이다.

standard layout type는 다음과 같은 특성을 가진다.


virtual method나 부모 class를 갖지 않는다.

Nonstatic data member가 동일한 접근 제어를 가진다.

모든 부모 클래스가 standard layout이다.

첫번째 nonstatic member로 부모 class와 동일한 type의 data를 갖지 않는다.

reference member를 갖지 않는다.

한개 이상의 부모 class 혹은 자식 및 부모 클래스 둘다에서 nonstatic data를 갖지 않는다.


좀더 간단하게 살펴보려면 <type_traits>의 std::is_standard_layout을 이용하면 된다.



Trivial type


Trivial type은 간단한 standard 생성자 및 소멸자와 간단한 복사 및 이동 연산을 갖고 있는 type이다.

다르게 말하면 bit단위 연산들이 가능하면 된다.

copy, move, destructor가 간단하지 않은 경우는 다음과 같다.


user가 정의한 것이다.

class가 virtual method를 가진다.

class가 virtual 부모 class를 가진다.

class가 간단하지 않은 member나 부모 class를 가진다.


좀더 간단하게 살펴보려면 <type_traits>의 std::is_trivial을 이용하면 된다.



즉 POD가 될 수 있는 조건은


복잡한 layout을 가지지 않는다.(virtual method 등)

user가 정의한 copy constructor를 갖지 않는다.

간단한 default constructor를 갖고 있다.


 C++11부터는 default가 아닌 constructor를 추가하거나 빼는 것이 layout이나 성능에 영향을 주지 않는다.



    
struct S0 { }; //POD
struct S1 { int i ; }; // POD
struct S2 { int i; S2(int ii) : i(ii) { } }; // default constructor가 없으므로 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( ); }; // virtual method가 있으므로 POD가 아니다.
struct S6 : S1 { }; // POD
struct S7 : S0 { int b; } //POD
struct S8 : S1 { int b; } //부모 class에 nonstatic member가 있으므로 POD가 아니다.
struct S9 : S0, S1 { }; //POD



'Language > C++' 카테고리의 다른 글

객체초기화 ' = ' , ' ( ) ' 의 차이점  (0) 2019.03.03
const / #define / constexpr 차이점  (0) 2019.03.01
Smart Pointer  (0) 2019.03.01
Pointer / Reference 차이점  (0) 2019.03.01