Search
Duplicate
🧺

offsetof() : 중첩된 클래스에서 중첩한 클래스의 포인터 얻기

Category
S/W 엔지니어
Tags
C++
Don Box
COM
offsetof()
Created time
2005/04/07
Don Box의 Essential COM을 보다가 발견한 묘~한 테크닉.
뭐, 중첩된 클래스의 생성자 등에서 중첩한 클래스의 this 포인터를 인수로 넘겨주어, 이를 멤버 변수로 갖고 있으면 되니깐, 그다지 실무에서 쓰일 일은 없는 듯한 테크닉이다. 하지만 (작긴 하지만) 멤버 변수가 차지할 메모리를 안잡아 먹는다는 점, 그리고 요 테크닉을 다른 곳으로도 확대해서 쓸 가능성이 보인다는 점에서 봐둘만 하다. COM에서는 composition 기법에서 요 테크닉을 사용한다고. 이놈의 COM을 제대로 알려면 instance의 메모리 구조도 알아야 하니... 쭈압. composition 기법은 MFC의 COM에서 사용한단다.
다음은 요 테크닉의 핵심인 offsetof() 매크로.
size_t offsetof(structName, memberName);
C++
복사
offsetof()는 자신의 부모 구조체(중첩한 클래스)의 시작 주소에서 멤버(중첩된 클래스 등) 주소까지의 거리(offset)를 반환한다고. 요놈은 함수가 아닌 매크로다. 다음은 샘플코드다.
#include <iostream> using std::cout; using std::endl; struct parent { struct child { parent* GetParent() { return reinterpret_cast<parent*>((char*)this - offsetof(parent, m_ch)); } }; child m_ch; void print() { cout << "parent print method called!" << endl; } }; int main() { parent pa; pa.m_ch.GetParent()->print(); return 0; }
C++
복사
출력 결과는 아래와 같다.
parent print method called!
C++
복사