Google C++ Style Guide ( https://google.github.io/styleguide/cppguide.html ) 를 확인하다보니 POD에 관한 내용이 나옵니다.
Static and Global Variables
Variables of class type with
static storage duration are forbidden: they cause hard-to-find bugs due to indeterminate order of construction and destruction. However, such variables are allowed if they are
constexpr
: they have no dynamic initialization or destruction.
Objects with static storage duration, including global variables, static variables, static class member variables, and function static variables, must be Plain Old Data (POD): only ints, chars, floats, or pointers, or arrays/structs of POD.
POD(Plain Old Data)가 뭔지 몰라서 검색하고 정리합니다.
http://1stpasa.tistory.com/13 과 http://www.gpgstudy.com/forum/viewtopic.php?t=10067&sid=4598bc316bf03f5c1f90aecdad41e177 의 내용을 기반합니다.
POD란 C의 struct나 build-in-type과 동일한 메모리 구조를 갖는 Object를 의미합니다.
따라서 build-in-type과 같이 쓸 수 있는 타입이죠.
memset, memcpy에 의한 단순 메모리 복사가 가능한 구조이며 다음의 조건을 가진다고 합니다.
1. built-in type
2. 가상 함수가 없고 사용자 정의 할당자(allocator)와 소멸자를 가지지 않는 Class의 Object
3. non POD를 non-static 멤버로 가지지 않는 Class의 Object
경우에 따른 메모리 구조 변경이 일어나지 않으면 POD로 생각하면 될 것 같네요.
1은 이해가 되고, 3의 에서 static에 관한 내용은 static은 객체에 포함되는 멤버가 아니므로 non-POD가 static으로 있는 것은 괜찮지만 그렇지 않으면 당연히 POD가 안되겠지요. 좀 더 쉽게 쓰면 "POD만을 non-static으로 가져야 POD다." 가 됩니다. (말이 어려웠네요)
2번째 조건에서 사용자 정의 할당자(allocator)에 대해서는 조금 설명이 필요합니다.
사용자 정의 할당자는 정의가 되어 있건 아니건, 할당 위치에 영향을 미치고 객체 내부의 메모리 배치에는 영향을 주지 않습니다.
그럼 POD여도 될 것 같은데 그렇지가 않습니다.
위 사이트에 나온 Code로 설명하겠습니다.
다음의 코드의 할당문( = )과 memcpy의 결과는 동일합니다.
그러나 다음과 같이 사용자 정의 할당문( 연산자 "=" 오버로딩)을 만들면 memcpy와 결과가 다릅니다.
NPOD& operator=( const NPOD& other) |
int bufLen = strlen (other.buf_); |
buf_ = new char [bufLen+1]; |
memcpy (buf_, other.buf_, bufLen); |
주의 깊게 작성하면 동일 할 수도 있겠지만(아마도) 위와 같이 그렇지 않을 수도 있습니다.따라서 C++에서는 non-POD로 규정하여 C style 메모리 관리 함수 사용을 금지합니다.
댓글 없음:
댓글 쓰기