딴 분의 글에 리플로 질문을 했었는데, 아무래도 정식으로 질문해야겠군요...;
멤버 변수만 있는 클래스에서 int나 float 같이 기본 수치형들만 받아들여도 문제가 생기나요? 메모리 매핑 구조 자체가 C와 C++은 다른 건가요?
struct는 class의 일부분이라는 비야네 아저씨의 선언이 있으니 struct도 마찬가지겠지요?
좀 상관 없지만, 대강 기억나는 건 비주얼 스튜디오에선 메모리 할당을 할 경우 할당 메모리 주위를 펜스로 둘러싸서 관리하고 컴파일러마다 관리 방식이 틀리다고 했던 것 같은데요..영어의 압박(검색어 칠 때마다 주루룩 쏟아지는 킬로 단위의 아티클 개수가..)으로 제대로 뒤져본 것도 없어서 오히려 혼동되고 있습니다..;;
C에서는 그냥 사용자 지정 타입이란 개념으로만 써서 사용할 때 메모리 관리는 좀 단순했는데, C++은 감이....;;;;
C++에서 메모리 관리가 어떻게 되죠?
Moderator: 류광
-
- Posts: 85
- Joined: 2005-10-23 05:46
- Location: NCsoft openmaru studio
- Contact:
...
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를 사용해도 괜찮습니다.
하나는 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를 쓸 예정이긴 합니다만...;;
근데 POD의 조건으로 나와 있는 3가지 항목을 보니,
1번은 기본 멤버 변수 타입을 요구하는 것 같고
2번은 생성, 소멸자 및 가상함수 같이 유저 외에 컴파일러가 따로 처리해야 하는 부분이 없어야 하며
3번은 사용자 정의 타입이나 함수의 사용에 있어서는 static으로 사용될 용량을 도출해 낼 수 있어야 한다...
란 의미인 걸로 우선 해석되는데, 방향을 제대로 잡았나요?
어차피 int하고 float, char의 멤버 변수로만 구성된 struct를 쓸 예정이긴 합니다만...;;
-
- Posts: 32
- Joined: 2006-01-31 13:51
Re: ...
C의 구조체와 같은 배치와 사용법을 가지는 C++의 구조체, 클래스는 다음과 같은 조건을 가져야 합니다.gimmesilver wrote: 1. built-in type
2. 가상 함수를 가지지 않으며 사용자 정의 할당자와 소멸자를 가지지 않은 class의 object
3. non POD를 non-static 멤버로 가지지 않은 class의 object
A. built-in 타입, 또는 다른 POD타입만을 멤버로 가질 것.
B. 가상함수가 없을 것.
부연하자면,
A. 말씀하신 조건중 1번과 3번은 사실상 같은 내용입니다. POD타입은 built-in 타입과 같이 쓸 수 있는 타입을 말하므로 어떠한 것이 오더라도 상관이 없습니다. 또한, 스태틱 멤버는, 당연히 아시겠지만, 객체에 포함되는 멤버가 아니므로 POD이건 non-POD이건 무엇이 오건 영향을 미치지 않습니다.
B. 가상함수만 없다면, 생성자(constructor)와 소멸자(destructor)는 있건 없건 메모리 배치에 영향을 주지 않습니다. (물론, 가상소멸자는 가상함수에 포함됩니다) 사용자 정의 할당자(allocator) 역시 정의되어 있건 아니건, 할당 위치에 영향을 미칠 뿐, 객체 내부의 메모리 배치에는 영향을 주지 않습니다. RTTI역시 메모리 배치에 영향을 주긴 하지만, 가상함수가 없는 타입의 객체에는 RTTI가 포함되지 않으므로 가상함수를 안쓴다면 신경 안써도 됩니다.
-
- Posts: 85
- Joined: 2005-10-23 05:46
- Location: NCsoft openmaru studio
- Contact:
Re: ...
말씀하신 것처럼 사용자 정의 할당자나 소멸자는 메모리 배치에 영향을 주지 않습니다. 그러나 규격에서는 사용자 정의 할당자가 있는 객체를 non-POD라고 규정합니다. 그 이유는 할당문의 결과와 물리적인 복사의 결과가 일치하지 않을 수 있기 때문입니다.theuhm wrote:C의 구조체와 같은 배치와 사용법을 가지는 C++의 구조체, 클래스는 다음과 같은 조건을 가져야 합니다.gimmesilver wrote: 1. built-in type
2. 가상 함수를 가지지 않으며 사용자 정의 할당자와 소멸자를 가지지 않은 class의 object
3. non POD를 non-static 멤버로 가지지 않은 class의 object
A. built-in 타입, 또는 다른 POD타입만을 멤버로 가질 것.
B. 가상함수가 없을 것.
부연하자면,
A. 말씀하신 조건중 1번과 3번은 사실상 같은 내용입니다. POD타입은 built-in 타입과 같이 쓸 수 있는 타입을 말하므로 어떠한 것이 오더라도 상관이 없습니다. 또한, 스태틱 멤버는, 당연히 아시겠지만, 객체에 포함되는 멤버가 아니므로 POD이건 non-POD이건 무엇이 오건 영향을 미치지 않습니다.
B. 가상함수만 없다면, 생성자(constructor)와 소멸자(destructor)는 있건 없건 메모리 배치에 영향을 주지 않습니다. (물론, 가상소멸자는 가상함수에 포함됩니다) 사용자 정의 할당자(allocator) 역시 정의되어 있건 아니건, 할당 위치에 영향을 미칠 뿐, 객체 내부의 메모리 배치에는 영향을 주지 않습니다. RTTI역시 메모리 배치에 영향을 주긴 하지만, 가상함수가 없는 타입의 객체에는 RTTI가 포함되지 않으므로 가상함수를 안쓴다면 신경 안써도 됩니다.
예를 들어
Code: Select all
class POD
{
int x_;
char* buf_;
}
POD t1;
POD t2;
...
t1 = t2;
memcpy(&t1, &t2);
Code: Select all
class NPOD
{
int x_;
char* buf_;
NPOD() : buf_(0) {}
~NPOD() { delete buf_; }
NPOD& operator=(const NPOD& other)
{
x_ = other.x_;
int bufLen = strlen(other.buf_);
buf_ = new char[bufLen+1];
memcpy(buf_, other.buf_, bufLen);
}
}
NPOD t1, t2;
...
t1 = t2;
memcpy(&t1, &t2);
C에서는 연산자 재정의라는 것이 없기 때문에 이런 혼란을 주지 않지만 C++에서는 이런 문제가 있을 수 있기 때문에 애초에 사용자 정의 할당자나 소멸자가 있는 객체를 non-POD로 규정하고 C스타일의 메모리 관리 함수 사용을 금하는 것입니다.
그리고 비슷한 이유로 built-in type과 non-POD type을 구분하여 언급했습니다.
마지막으로 질문하신 분에게 혼동을 드린 것 같은데 3번 이야기는 말을 바꾸면, 'POD 만을 non-static 멤버로 가지는 class의 object' 라는 뜻이었습니다.
-
- Posts: 32
- Joined: 2006-01-31 13:51
Re: ...
질문자의 원래 의도인 '객체의 내부 메모리 배치'에 대한 부분에서 약간 핵심을 벗어나는 것 같아서gimmesilver wrote:위의 할당문과 memcpy()결과는 일치하지 않습니다. 따라서 사용자에게 혼동을 줄 수 있습니다.
C에서는 연산자 재정의라는 것이 없기 때문에 이런 혼란을 주지 않지만 C++에서는 이런 문제가 있을 수 있기 때문에 애초에 사용자 정의 할당자나 소멸자가 있는 객체를 non-POD로 규정하고 C스타일의 메모리 관리 함수 사용을 금하는 것입니다.
그리고 비슷한 이유로 built-in type과 non-POD type을 구분하여 언급했습니다.
마지막으로 질문하신 분에게 혼동을 드린 것 같은데 3번 이야기는 말을 바꾸면, 'POD 만을 non-static 멤버로 가지는 class의 object' 라는 뜻이었습니다.
참견해 보았습니다