구조체 메모리 크기 (Struct Memory Size): 두 판 사이의 차이

기술노트
(컴퓨터 과학 용어 정리 - 구조체 메모리 크기 (Struct Memory Size) 추가)
태그: 수동 되돌리기
편집 요약 없음
 
1번째 줄: 1번째 줄:
=== [C] 구조체 메모리 크기 (Struct Memory Size) ===
== [C] 구조체 메모리 크기 (Struct Memory Size) ==


typedef struct 선언 시, 변수 선언에 대한 메모리 공간 크기에 대해 알아보자
C언어에서 구조체(struct)를 사용할 때, 변수 선언 시 할당되는 메모리 공간 크기에 대해 알아보자.


> 기업 필기 테스트에서 자주 나오는 유형이기도 함
기업의 필기 테스트나 면접에서 자주 출제되는 유형이므로 반드시 이해하고 숙지할 필요가 있다.


<br>
=== 기본 자료형의 크기 ===


* char : 1바이트
C언어에서 자주 사용하는 기본 자료형과 그 크기는 다음과 같다.
* int : 4바이트
* double : 8바이트


`sizeof` 메소드를 통해 해당 변수의 사이즈를 알 수 있음
'''char''' : 1바이트


<br>
'''int''' : 4바이트


===== 크기 계산 =====
'''double''' : 8바이트


---
각 변수나 자료형의 크기는 sizeof 연산자를 통해 쉽게 확인할 수 있다.


<syntaxhighlight>c
=== 구조체 메모리 크기 계산 규칙 ===
typedef struct student {
    char a;
    int b;
}S;


void main() {
구조체가 메모리를 할당할 때는 다음 두 가지 중요한 규칙이 적용된다.
    printf("메모리 크기 = %d/n", sizeof(S)); // 8
}
</syntaxhighlight>


char는 1바이트고, int는 4바이트라서 5바이트가 필요하다.
'''가장 큰 크기를 가진 멤버의 자료형을 기준으로 메모리 공간을 할당'''한다.


하지만 메모리 공간은 5가 아닌 '''8이 찍힐 것이다'''.
구조체의 전체 크기는 '''가장 큰 자료형의 배수'''가 되어야 하며, 이를 위해 남는 공간은 여유 공간(padding)으로 채워진다.


'''''Why?'''''
==== 예시를 통한 이해 ====


구조체가 메모리 공간을 잡는 원리에는 크게 두가지 규칙이 있다.
다음 예시들을 통해 보다 쉽게 이해해 보자.


1. 각각의 멤버를 저장하기 위해서는 '''기본 4바이트 단위로 구성'''된다. (4의 배수 단위)
==== 예시 1 ====
  즉, char 데이터 1개를 저장할 때 이 1개의 데이터를 읽어오기 위해서 1바이트를 읽어오는 것이 아니라 이 데이터가 포함된 '4바이트'를 읽는다.
2. 구조체 각 멤버 중에서 가장 큰 멤버의 크기에 영향을 받는다.


<br>
int main() {
 
printf("메모리 크기 = %d\n", sizeof(S)); // 출력: 8
이 규칙이 적용된 메모리 공간은 아래와 같을 것이다.
return 0;
 
}
a는 char형이지만, 기본 4바이트 단위 구성으로 인해 3바이트의 여유공간이 생긴다.
 
<img src="http://postfiles2.naver.net/20150930_177/sharonichoya_1443599417738eaCq5_PNG/%B1%B8%C1%B6%C3%BC%C5%A9%B1%E23.png?type=w2">
 
<br>
 
그렇다면 이와 같을 때는 어떨까?
 
<syntaxhighlight>c
typedef struct student {
    char a;
    char b;
    int c;
}S;
</syntaxhighlight>
 
<img src="http://postfiles15.naver.net/20150930_14/sharonichoya_1443599661246BGweK_PNG/%B1%D7%B8%B21.png?type=w2">
 
똑같이 8바이트가 필요하며, char형으로 선언된 a,b가 4바이트 안에 함께 들어가고 2바이트의 여유 공간이 생긴다.
 
<br>
 
이제부터 헷갈리는 경우다.
 
<syntaxhighlight>c
typedef struct student {
    char a;
    int c;
    char b;
}S;
</syntaxhighlight>
 
구성은 같지만, 순서가 다르다.
 
자료타입은 일치하지만, 선언된 순서에 따라 할당되는 메모리 공간이 아래와 같이 달라진다.


<img src="http://postfiles15.naver.net/20150930_142/sharonichoya_1443599763574jksKW_PNG/%B1%D7%B8%B22.png?type=w2">


이 경우에는 12바이트가 필요하게 된다.
실제 필요한 공간은 char(1바이트)와 int(4바이트)를 합쳐 5바이트이다. 그러나 가장 큰 멤버인 int를 기준으로 4바이트씩 구성되어야 하므로, 구조체의 크기는 8바이트가 된다. 따라서 3바이트의 여유 공간이 생긴다.


<br>
==== 예시 2 ====


<syntaxhighlight>c
이 경우에도 총 8바이트가 할당된다. char 멤버 두 개(a와 b)는 한 번에 4바이트 공간에 배치되고, 나머지 2바이트는 여유 공간으로 처리된다.
typedef struct student {
    char a;
    int c;
    double b;
}S;
</syntaxhighlight>


두 규칙이 모두 적용되는 상황이다. b가 double로 8바이트이므로 기본 공간이 8바이트로 설정된다. 하지만 a와 c는 8바이트로 해결이 가능하기 때문에 16바이트로 해결이 가능하다.
==== 예시 3 (멤버 선언 순서에 따른 차이) ====


<img src="http://postfiles4.naver.net/20150930_83/sharonichoya_1443600192056XIAc4_PNG/%B1%D7%B8%B24.png?type=w2">
이 경우 멤버들의 선언 순서로 인해 메모리 공간이 각각 따로 구성되면서, 중간마다 padding이 발생해 총 12바이트가 필요하게 된다. 따라서 구조체를 선언할 때는 자료형 크기별로 정렬하여 선언하는 것이 메모리 절약에 효과적이다.


<br>
==== 예시 4 ====


<br>
여기서는 가장 큰 자료형이 double(8바이트)이므로, 기본 메모리 할당 단위는 8바이트다. 결과적으로 총 16바이트가 구조체에 할당된다.


##### [참고자료]
=== 구조체 사용 시 주의사항 ===


[링크](<http://blog.naver.com/PostView.nhn?blogId=sharonichoya&logNo=220495444611>)
구조체의 메모리 크기는 멤버의 선언 순서와 자료형의 크기에 따라 달라지므로 항상 자료형 크기를 고려하여 선언 순서를 정하는 것이 효율적이다.

2025년 5월 5일 (월) 08:00 기준 최신판

[C] 구조체 메모리 크기 (Struct Memory Size)

C언어에서 구조체(struct)를 사용할 때, 변수 선언 시 할당되는 메모리 공간 크기에 대해 알아보자.

기업의 필기 테스트나 면접에서 자주 출제되는 유형이므로 반드시 이해하고 숙지할 필요가 있다.

기본 자료형의 크기

C언어에서 자주 사용하는 기본 자료형과 그 크기는 다음과 같다.

char : 1바이트

int : 4바이트

double : 8바이트

각 변수나 자료형의 크기는 sizeof 연산자를 통해 쉽게 확인할 수 있다.

구조체 메모리 크기 계산 규칙

구조체가 메모리를 할당할 때는 다음 두 가지 중요한 규칙이 적용된다.

가장 큰 크기를 가진 멤버의 자료형을 기준으로 메모리 공간을 할당한다.

구조체의 전체 크기는 가장 큰 자료형의 배수가 되어야 하며, 이를 위해 남는 공간은 여유 공간(padding)으로 채워진다.

예시를 통한 이해

다음 예시들을 통해 보다 쉽게 이해해 보자.

예시 1

int main() { printf("메모리 크기 = %d\n", sizeof(S)); // 출력: 8 return 0; }


실제 필요한 공간은 char(1바이트)와 int(4바이트)를 합쳐 총 5바이트이다. 그러나 가장 큰 멤버인 int를 기준으로 4바이트씩 구성되어야 하므로, 구조체의 크기는 8바이트가 된다. 따라서 3바이트의 여유 공간이 생긴다.

예시 2

이 경우에도 총 8바이트가 할당된다. char 멤버 두 개(a와 b)는 한 번에 4바이트 공간에 배치되고, 나머지 2바이트는 여유 공간으로 처리된다.

예시 3 (멤버 선언 순서에 따른 차이)

이 경우 멤버들의 선언 순서로 인해 메모리 공간이 각각 따로 구성되면서, 중간마다 padding이 발생해 총 12바이트가 필요하게 된다. 따라서 구조체를 선언할 때는 자료형 크기별로 정렬하여 선언하는 것이 메모리 절약에 효과적이다.

예시 4

여기서는 가장 큰 자료형이 double(8바이트)이므로, 기본 메모리 할당 단위는 8바이트다. 결과적으로 총 16바이트가 구조체에 할당된다.

구조체 사용 시 주의사항

구조체의 메모리 크기는 멤버의 선언 순서와 자료형의 크기에 따라 달라지므로 항상 자료형 크기를 고려하여 선언 순서를 정하는 것이 효율적이다.