http://www.gpgstudy.com/forum/viewtopic.php?p=49015






C++에서는 메모리 구조 측면에서 두 종류의 object를 갖습니다. 

하나는 C의 structure나 built-in type과 동일한 메모리 구조를 갖는 object이고 다른 하나는 다형성이나 생성/소멸자 등등의 특성을 사용할 수 있는 object입니다. 전자를 Plain Old Data(POD)라고 하고 후자를 non-POD라고 합니다. 


POD object는 C의 구조체처럼 똑같이 사용할 수 있습니다. memcpy나 memset 등을 사용할 수 있습니다. POD 의 조건은 아래와 같습니다. 

1. built-in type 

2. 가상 함수를 가지지 않으며 사용자 정의 할당자와 소멸자를 가지지 않은 class의 object 

3. non POD를 non-static 멤버로 가지지 않은 class의 object 


위 조건만 만족한다면 C의 struct처럼 object를 사용해도 괜찮습니다.






전송 구조에선 아무래도 메모리로 관리해 주는 게 편할 것 같아서 좀 고민했거든요... 
근데 POD의 조건으로 나와 있는 3가지 항목을 보니, 

1번은 기본 멤버 변수 타입을 요구하는 것 같고 
2번은 생성, 소멸자 및 가상함수 같이 유저 외에 컴파일러가 따로 처리해야 하는 부분이 없어야 하며 
3번은 사용자 정의 타입이나 함수의 사용에 있어서는 static으로 사용될 용량을 도출해 낼 수 있어야 한다... 

란 의미인 걸로 우선 해석되는데, 방향을 제대로 잡았나요? 
어차피 int하고 float, char의 멤버 변수로만 구성된 struct를 쓸 예정이긴 합니다만...;;







C의 구조체와 같은 배치와 사용법을 가지는 C++의 구조체, 클래스는 다음과 같은 조건을 가져야 합니다. 


A. built-in 타입, 또는 다른 POD타입만을 멤버로 가질 것. 

B. 가상함수가 없을 것. 


부연하자면, 

A. 말씀하신 조건중 1번과 3번은 사실상 같은 내용입니다. POD타입은 built-in 타입과 같이 쓸 수 있는 타입을 말하므로 어떠한 것이 오더라도 상관이 없습니다. 또한, 스태틱 멤버는, 당연히 아시겠지만, 객체에 포함되는 멤버가 아니므로 POD이건 non-POD이건 무엇이 오건 영향을 미치지 않습니다. 

B. 가상함수만 없다면, 생성자(constructor)와 소멸자(destructor)는 있건 없건 메모리 배치에 영향을 주지 않습니다. (물론, 가상소멸자는 가상함수에 포함됩니다) 사용자 정의 할당자(allocator) 역시 정의되어 있건 아니건, 할당 위치에 영향을 미칠 뿐, 객체 내부의 메모리 배치에는 영향을 주지 않습니다. RTTI역시 메모리 배치에 영향을 주긴 하지만, 가상함수가 없는 타입의 객체에는 RTTI가 포함되지 않으므로 가상함수를 안쓴다면 신경 안써도 됩니다.

반응형

+ Recent posts