요즘 회사에서 visual C++ 2003에서 Visual C++ 2008로 컨버팅 작업을 하다가

독자적으로 구현한 hashmapList 라는것이 있는데 이중 iterator 를 구현한것에서 컴파일이 되지 않는 현상이 발생하였다.

참 애매한 컴파일 문제 였는데.

iterator_category 가 구현되어 있지 않다고 에러가 났는데 도무지 모르겠더군요.

소스를 추척하다보니 iterator_traits 이 구현되어 있지 않다는걸 알아 냈는데.

전에 내용을 이해 하지 못한체 읽은 The C++ Programing Language 책에 특성(trait)가 생각나서 봐 보았는데.

이게 바로 에러가 나는 원인이었습니다.

이제서야 이 책의 필요성을 느꼈습니다.

전에는 별 필요성을 못느끼고 의무감에서 봤는데.. 이제는 필요성이 느껴져서 읽을것 같습니다.

책은 필요성은 있어야 재미있게 읽을수 있을것 같습니다.^^
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
  1. C++ 기초 문법책을 본다.
    1. 열혈강의 C++ 프로그래밍 , 프리렉 , 윤성우
    2. Accelerated C++ : 예제로 배우는 진짜배기 C++ 프로그래밍
  2. 디자인 패턴책을 본다.
    1. Head First Design Patterns 를 보고 이를 한번 적용한 케이스를 찾아본다.
    2. 직접 사용도 해본다.
  3. C++ 응용책
    1. Effective STL, Effective C++
    2. The C++ Programing Language
  4. 기타 도움을 줄만한 책
    1. 운영체제 기초책

위책은 순수하게 C++를 배우는 책들이며..

여기에 열혈강의 C++ 프로그래밍 책을 다음부터는
자기가 배워야 할 분야의 책을 동시에 보기를 봐야 할거라고 생각합니다.

한번에 이해할려고 하지말고 여러번 보고 이해하는것이 방법인것 같습니다.

배우는 기간은 3년이상으로 생각합니다.

+ Recent posts