이미지와 글귀

반응형

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <stdlib.h>
 
#pragma pack( 1 )
 
struct data_t
{
    char ch1;
  int in1;
  short in2;
};
 
void main(void)
{
    struct data_t data;
 
    printf( "data_t 크기 = %d\n"sizeof( data ) );
}



#pragma pack을 쓰지 않으면 구조체의 메모리는 자료형의 크기가 제일 큰 변수를 기준으로 삼는다는건 익히 알고 있는 사실.
그런데 의외의 사실은...

#pragme pack(1)을 선언하지 않고
변수를 
char ch1;
int in1;
short in2; 

으로 선언하면 구조체의 메모리의 크기는 12Byte로 잡히고 (여기까진 일반적)

char ch1;
short in2; 
int in1;

이런 순으로 선언하면 8Byte로 잡힌다.

여기서 추측할 수 있는 사실은
컴파일러는 구조체의 변수들을 순서대로 판단하되,
그 변수들의 크기까지 고려한다는 것..

sizeof(char) + sizeof( short )는 3이 된다.
위 코드에서 제일 큰 변수(int)의 메모리는 4Byte.
즉 컴파일러는 순서대로 잡힌 char와 short의 메모리를 한 칸(4Byte)에 같이 저장해버린 듯 하다. (여기서 낭비된 메모리는 1Byte)
결국 struct의 크기는 8Byte.

단, char -> int -> short 순으로 멤버 변수를 선언하면
char 1Byte -> 4Byte.
int -> 그대로 4Byte.
short 2Byte -> 4Byte
struct의 크기는 12Byte가 된다는 사실!

char형 변수 다음에 제일 큰 메모리를 차지하는 int형 변수가 오니 char형 변수는 
따로 4Byte 크기의 단칸방을 마련해주고(낭비된 메모리는 3Byte)
int형 변수는 int형대로 4Byte 방을,
그런데 웬걸? 다음에 short가 오네?!
어쩔 수 없이 short형 변수도 4Byte 크기의 단칸방을..(낭비된 메모리는 2Byte)
struct의 크기는 12Byte.

주소값을 직접 출력해보면 확실해질 것..

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <stdlib.h>
 
//#pragma pack( 1 )
 
struct data_t
{
    char ch1;
    short in2;
    int in1;
};
 
void main(void)
{
    struct data_t data;
 
    printf( "data_t 크기 = %d\n"sizeof( data ) );
 
    printf( "ch1 - %x\nin2 - %x\nin1 - %x\n", &data.ch1, &data.in2, &data.in1 );
}


////////////////////////////////////////////////
// 두번째 주소 출력 코드
// int를 short의 앞으로
////////////////////////////////////////////////

#include <stdio.h>
#include <stdlib.h>
 
//#pragma pack( 1 )
 
struct data_t
{
    char ch1;
   int in1;
   short in2;
};
 
void main(void)
{
    struct data_t data;
 
    printf( "data_t 크기 = %d\n", sizeof( data ) );

   printf( "ch1 - %x\nin1 - %x\nin2 - %x\n", &data.ch1, &data.in1, &data.in2 );
}



반응형

'프로그래밍 > C, C++' 카테고리의 다른 글

MFC CView 관련 오류 및 버그  (0) 2018.06.10

이 글을 공유합시다

facebook twitter googleplus kakaoTalk kakaostory naver band