offsetof은 클레스나 구조체에 있는 member 위치를 알려주는 키워드다.

일단 소스와 결과를 보라.

#include <iostream>
using namespace std;

struct sA
{
    int a;
    double b;
    short c;
    short d;
    int e;
};

int main()
{
    cout << "sizeof(sA) : " << sizeof(sA) << endl;
    cout << "offsetof(sA::a) : " << offsetof(sA, a) << endl;
    cout << "offsetof(sA::b) : " << offsetof(sA, b) << endl;
    cout << "offsetof(sA::c) : " << offsetof(sA, c) << endl;
    cout << "offsetof(sA::d) : " << offsetof(sA, d) << endl;
    cout << "offsetof(sA::e) : " << offsetof(sA, e) << endl;
    return 0;
}
출력)

sizeof(sA) : 20
offsetof(sA::a) : 0
offsetof(sA::b) : 4
offsetof(sA::c) : 12
offsetof(sA::d) : 14
offsetof(sA::e) : 16

그럼 설명 하겠지만 엉성하다.
struct sA
{
    int a;
    double b;
    short c;
    short d;
    int e;
};
위 코드에서
32bit머신에서

int a 크기는 4byte.
double b 크기는 8byte.
short c 크기는 2byte.
short d 크기는 2byte.
int e 크기는 4byte 이다.

sizeof( sA ) 를 하면.
출력값이 4+8+2+2+4 = 20이 나올것이다.

cout << "sizeof(sA) : " << sizeof(sA) << endl;

출력)
$ ./sizeof
sizeof(sA) : 20

그러면 a위치가 어디인지 아는 방법은 없을까?
방법은 있다. offsetof라는거다.

a위치는 0번째부터 3번째까지일테고
b위치는 4번부터 11번째 위치.. 이렇게 될것이다.

자 그럼 어떤 원리일까?
offsetof를 따라가 보면 아래와 같은 소스가 나온다.
#define offsetof(s,m) (size_t)&(((s *)0)->m)
무슨뜻일까?ㅡ.ㅡ

offsetof(sA, b) 를 대입 해보자
(size_t)&(((sA *)0)->b)
아 머리 아프다.

아래걸 보자.
((sA *)0)
무슨뜻일까?
0번지 주소값에 sA가 있다고 가정하는것이다.
결론은 0...

여기서 ->b를 넣었다.
(0)->b

움. 무슨뜻?
컴퓨터는 메모리를 접근할때 기본 주소에 해당 멤버의 offset을 더해서 나머지 값들을 구한다.
결국 위의 것은

(0)->b 는
0 + (b의 위치) 가 된다.
결국
0+4 = 4
설명이 엉성하므로 아래 사이트를 보는것도 좋다.

http://kldp.org/node/62717

+ Recent posts