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

기술노트
편집 요약 없음
태그: 수동 되돌리기 되돌려진 기여
편집 요약 없음
 
(같은 사용자의 중간 판 하나는 보이지 않습니다)
1번째 줄: 1번째 줄:
=== C 언어 구조체 메모리 크기 (Struct Memory Size) ===
== [C] 구조체 메모리 크기 (Struct Memory Size) ==


C 언어에서 `typedef struct`통해 정의된 구조체는 내부 멤버 변수들의 선언 순서와 자료형에 따라 메모리 공간의 크기 및 배치 방식이 달라집니다.
C언어에서 구조체(struct)사용할 때, 변수 선언 시 할당되는 메모리 공간 크기에 대해 알아보자.


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


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


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


* `char` : 1바이트
'''char''' : 1바이트
* `int` : 4바이트 
* `double` : 8바이트


`sizeof` 연산자를 통해 구조체 전체의 크기를 확인할 수 있습니다.
'''int''' : 4바이트


<br>
'''double''' : 8바이트


==== 예제 1: 기본 구조체 메모리 크기 ====
각 변수나 자료형의 크기는 sizeof 연산자를 통해 쉽게 확인할 수 있다.


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


int main() {
구조체가 메모리를 할당할 때는 다음 두 가지 중요한 규칙이 적용된다.
    printf("메모리 크기 = %d\n", sizeof(S)); // 출력: 8
    return 0;
}
```


* `char`는 1바이트, `int`는 4바이트이므로 단순 계산으로는 5바이트가 예상됩니다. 
'''가장 큰 크기를 가진 멤버의 자료형을 기준으로 메모리 공간을 할당'''한다.
* 그러나 실제 출력값은 **8바이트**입니다.


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


<br>
==== 예시를 통한 이해 ====


==== 구조체 정렬 규칙 ====
다음 예시들을 통해 보다 쉽게 이해해 보자.


1. 각 멤버는 **자료형의 정렬 기준(alignment)**에 따라 메모리에 배치됩니다. 일반적으로 4바이트 단위로 정렬됩니다. 
==== 예시 1 ====
2. 구조체 전체의 크기는 **가장 큰 멤버의 크기 배수**가 되도록 패딩(padding)됩니다.


예제에서 `char a` 뒤에는 3바이트의 패딩이 삽입되어, `int b`가 4바이트 정렬 주소에 위치하게 됩니다.
int main() {
 
printf("메모리 크기 = %d\n", sizeof(S)); // 출력: 8
[[파일:Struct-align1.png|center|600px]]
return 0;
 
}
<br>
 
==== 예제 2: 연속된 char 변수 ====
 
```c
typedef struct student {
    char a;
    char b;
    int c;
} S;
```
 
* `char a`와 `char b`는 하나의 4바이트 블록에 함께 배치됩니다. 
* 이후 2바이트의 패딩이 추가되고, `int c`가 정렬된 위치에 배치됩니다.
 
[[파일:Struct-align2.png|center|600px]]
 
→ 총 8바이트
 
<br>
 
==== 예제 3: 멤버 순서 변경 ====
 
```c
typedef struct student {
    char a;
    int c;
    char b;
} S;
```
 
* `char a` 뒤에 3바이트의 패딩이 삽입되고, `int c`가 정렬된 위치에 배치됩니다. 
* `char b`는 다시 별도 4바이트 블록에 위치하며, 그 뒤에 3바이트 패딩이 붙습니다.
 
[[파일:Struct-align3.png|center|600px]]
 
→ 총 12바이트
 
<br>


==== 예제 4: double 포함 구조체 ====


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


* `double`의 정렬 기준은 8바이트입니다. 
==== 예시 2 ====
* 전체 구조체는 8바이트 단위 정렬을 따르며, 멤버들이 이에 맞게 배치되어 총 16바이트가 됩니다.


[[파일:Struct-align4.png|center|600px]]
이 경우에도 총 8바이트가 할당된다. char 멤버 두 개(a와 b)는 한 번에 4바이트 공간에 배치되고, 나머지 2바이트는 여유 공간으로 처리된다.


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


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


* 구조체의 메모리 크기는 멤버의 **자료형 크기와 정렬 기준**에 따라 달라집니다. 
==== 예시 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바이트가 구조체에 할당된다.

구조체 사용 시 주의사항

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