예전에 선배가 이런 류의 문제를 낸 적이 있다.
난 당당히 21Byte입니다. 라고 했었는데... 쩝...
아래 구조체를 sizeof 하면 얼마가 나올까? struct stStructSize {
int index;
double nFirstData;
double nLastData;
unsigned char chType;
};
간단히 생각하면 21 byte가 나온다. ( 4 + 8 + 8 + 1 = 21 )
그렇지만 실제 sizeof(stStructSize)를 해보면 엉뚱하게도 32 byte 라는 결과를 출력한다.
왜 그런것일까? (참고로 int는 4byte, double은 8byte, unsigned char은 1byte)
이유은.. 컴파일러가 똑똑해서 그렇다.
사실 다소 메모리의 낭비가 있지만 원시코드로 변환했을때 효율적으로 퍼포먼스를 좋게하며 메모리를 관리(&접근) 하기 위함이다.
조금 더 얘기하자면 컴파일러의 내부 파싱이 dword aligned 을 기준으로 처리한 결과이다.
그래서 위의 경우에는 모든 자료형을 8byte로 계산한 것이다.
그렇지만 우리는 구조체의 접근방법, 데이터의 처리등 byte의 절대값으로 처리해야할 경우가 있다.
그럴때는 아래와 같이 전처리기를 선언해 주면 실제 원하는 크기인 21byte를 얻을 수 있다.
#pragma pack(1)
그럼 아래처럼 확인해 보면 정확히 byte size를 얻을 수 있는것을 알 수 있다.
int nLength = sizeof(stStructSize);
fprintf(stdout, "Struct Size = %d\n", nLength);
#pragma pack(1) 의 의미는 byte aligned 이다.
참고로 2는 word aligned 이며 4는 dword aligned 이다. class의 sizeof도 위와 마찬가지 결과이며 1을 생략한 #pragma pack() 으로 선언할 경우 기본적으로 dword aligned 처리된다.
위와 같은 문제아닌 문제가 있으므로 byte type 이나 word type을 이용할때는 주의가 필요하다.
한가지 더 퀴즈를 내자면,
int 형의 size를 알기 위해선 sizeof() 를 사용한다.
그러나, 이 sizeof()를 사용할 수 없을 경우 int 형의 size는 어떻게 알 수 있을까???
int cTest = -1;
로 선언한 후 bit 연산을 하면 알 수 있다.
'IT > 일반' 카테고리의 다른 글
fwrite 함수로 작성했으나, linux와 windows에서 사이즈가 ... (2) | 2009.07.27 |
---|---|
Naming Rule for C/C++ (2) | 2008.02.27 |