ShovelingLife
A Game Programmer
ShovelingLife
전체 방문자
오늘
어제
  • 분류 전체보기 (1067)
    • 그래픽스 (57)
      • 공통 (19)
      • 수학 물리 (22)
      • OpenGL & Vulkan (1)
      • DirectX (14)
    • 게임엔진 (180)
      • Unreal (69)
      • Unity (100)
      • Cocos2D-X (3)
      • 개인 플젝 (8)
    • 코딩테스트 (221)
      • 공통 (7)
      • 프로그래머스 (22)
      • 백준 (162)
      • LeetCode (19)
      • HackerRank (2)
      • 코딩테스트 알고리즘 (8)
    • CS (235)
      • 공통 (21)
      • 네트워크 (44)
      • OS & 하드웨어 (55)
      • 자료구조 & 알고리즘 (98)
      • 디자인패턴 (6)
      • UML (4)
      • 데이터베이스 (7)
    • 프로그래밍 언어 (346)
      • C++ (167)
      • C# (88)
      • Java (9)
      • Python (33)
      • SQL (30)
      • JavaScript (8)
      • React (7)
    • 그 외 (9)
      • Math (5)
      • 일상 (5)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Source Code 좌측 상단에 복사 버튼 추가 완료
  • 언리얼 엔진 C++ 빌드시간 단축 꿀팁
  • 게임 업계 코딩테스트 관련
  • 1인칭 시점으로 써내려가는 글들

인기 글

태그

  • 문자열
  • C++
  • C
  • c#
  • Unity
  • 알고리즘
  • 백준
  • SQL
  • string
  • 그래픽스
  • 유니티
  • 언리얼
  • 오블완
  • 배열
  • 프로그래머스
  • 클래스
  • 포인터
  • 파이썬
  • 함수
  • 티스토리챌린지

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ShovelingLife

A Game Programmer

프로그래밍 언어/C++

C++ POD, 표준 레이아웃 타입, 간단한 타입

2022. 7. 8. 12:32

POD (Plain Old Data)

메모리 상에서 연속적인 바이트 열이다. 다형성이나 유저가 정의한 복사 의미론 등과 같은 진보된 의미론 문법이 필요없을 때 개체를 POD로 취급해야 할 때가 있다. 왜냐하면, POD로 취급하면 하드웨어에서 좀 더 효율적으로 개체를 옮기거나 복사할 수 있기 때문이다. 

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

  1. 표준 레이아웃 타입(standard layout type)이어야 한다.
  2. 간단한 타입(trivial type)이어야 한다.

POD가 될 수 있는 조건

  1. 복잡한 레이아웃을 갖지 않는다.(가상 함수 등)
  2. 유저가 정의한 복사 의미론을 갖지 않는다.
  3. 간단한 기본 생성자를 갖고 있다.

<type_traits>의 std::is_pod를 이용하면 쉽게 알 수 있다.

표준 레이아웃 타입

C와 분명하게 같은 레이아웃을 갖고 있는 타입이며, 공통 C++ ABIs(Apllication Binary Interfaces)가 다룰 수 있는 타입이다.

다음의 특성을 가진다.

  1. 가상 함수나 가상 기저 클래스를 갖지 않는다.
  2. 비정적 데이터 멤버가 동일한 접근 제어를 가진다.
  3. 모든 비정적 데이터 멤버가 표준 레이아웃이다.
  4. 모든 기저 클래스가 표준 레이아웃이다.
  5. 첫번째 비정적 멤버로 기저 클래스와 동일한 타입의 데이터를 갖지 않는다.
  6. 레퍼런스 멤버를 갖지 않는다.
  7. 한 개 이상의 기저 클래스 혹은 파생 및 기저 클래스 둘 다에서 비정적 데이터를 갖지 않는다.

<type_traits>의 std::is_standard_layout을 이용하면 된다.

간단한 타입

(1)간단한 기본 생성자 및 소멸자와 (2)간단한 복사 및 이동 연산을 갖고 있는 타입이다. 다르게 말하면, 비트 단위 연산들이 가능하면 된다.

복사, 이동, 소멸자가 간단하지 않은 경우는 다음과 같다.

  1. 유저가 정의한 것이다.
  2. 그 클래스가 가상 함수를 가진다.
  3. 그 클래스가 가상 기저 클래스를 가진다.
  4. 그 클래스가 간단하지 않은 멤버나 기저 클래스를 가진다.

<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

출처 : https://haedallog.tistory.com/78

저작자표시 (새창열림)

'프로그래밍 언어 > 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
    '프로그래밍 언어/C++' 카테고리의 다른 글
    • C++ 친구 클래스 및 함수 (friend)
    • C/C++ 연산자(Operator) 정리표 (비트, 논리, 산술 +=&^<<>>%~!)
    • C++ namespace와 using
    • C/C++ 전처리기의 모든 것 (예외, 매크로, 토큰)
    ShovelingLife
    ShovelingLife
    Main skill stack => Unity C# / Unreal C++ Studying Front / BackEnd, Java Python

    티스토리툴바