본문 바로가기
~ 2024.03/C 언어

[C 언어 기초] 타입 별 메모리 크기

by Monett 2024. 1. 5.
반응형
현재 블럭의 내용은 작성자의 의견 혹은 생각이며, 틀린 내용이 있을 수 있습니다. 지적 감사드립니다.
아래 비트는 Windows 기준임을 알려드립니다.

64비트 운영체제

타입 크기
int 4
short 2
long 4
long long 8
char 1
float 4
double 8
int pointer 8
char pointer 8
void pointer 8

 

32비트 운영체제

타입 크기
int 4
short 2
long 4
long long 8
char 1
float 4
double 8
int pointer 4
char pointer 4
void pointer 4

struct의 메모리 크기

struct는 매우 독특한 동작을 한다.

구조체가 메모리 공간을 잡는 원리는 다음과 같다. (참고)

  • 구조체는 구조체가 포함하고 있는 요소들 중 가장 큰 값을 기준으로 그 값의 배수만큼의 크기를 가진다.
// 4byte
struct Sample {
    int x;
}

// 8byte
struct Sample {
    int x;
    char ch;
}

// 8byte
struct Sample {
    int x;
    float y;
}

// 16byte
struct Sample {
    int x;
    double y;
}

 

더욱 신기한 것은, 멤버의 순서에 따라 메모리 크기가 달라진다는 점이다. 

// 16byte
struct Sample {
    char ch;
    int x;
    double d;
};

// 24byte
struct Sample {
    char ch;
    double d;
    int x;
};

 

CPU가 자료형을 저장할 때 효율을 위해 자료형 크기의 배수에 해당하는 주소에 위치한다고 한다.

ex) short는 2의 배수, int 는 4의 배수 등

 

아래 코드도 1, 1, 2, 4 로 들어갈 수 있어 총 8byte가 나온다.

// 8byte
struct Sample {
    char ch;
    char ch2;
    short sh;
    int x;
};

 

그런데 아래 구조체는 12바이트이다. 왜일까?

// 12byte
struct Sample {
	int x;
	char ch;
	short sh;
	char ch2;
};

 

예상대로라면 4, 2, 2, 2 로 10바이트가 나올 것 같다. (short는 2의 배수에 들어갈 수 있기 때문에)

 

대부분의 컴파일러는 효율적인 메모리 액세스를 위해 구조체 멤버들을 정렬한다. 

따라서 패딩(padding)이 추가되며 12바이트로 메모리 정렬에 맞게 늘어나게 되는 것이다.

 

union의 메모리 크기

union의 크기는 멤버 중 가장 큰 크기의 메모리를 공유하게 된다.

// 4byte
union Data {
    int i;
    float f;
};

 

union도 동일하게 패딩이 추가되어 메모리 정렬이 이루어진다.

// 8byte
union Data {
    int i;
    float f;
    char str[5];
};

 

위 코드에서 가장 큰 크기는 char[5]로 5바이트 이지만, 메모리 정렬로 union의 크기는 8바이트가 된다.


sizeof 연산자

sizeof 는 연산자로, 컴파일 타임에 계산된다. 

따라서 자주 사용한다고 해서 변수에 size를 저장하는 것이 오히려 메모리 낭비가 될 수 있다.

반응형