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

기술노트
편집 요약 없음
태그: 되돌려진 기여
편집 요약 없음
태그: 되돌려진 기여 시각 편집
1번째 줄: 1번째 줄:
=== C 언어 구조체 메모리 크기 (Struct Memory Size) ===
<nowiki>=== C 언어 구조체 메모리 크기 (Struct Memory Size) ===</nowiki>


C 언어에서 `typedef struct`를 통해 정의된 구조체는 내부 멤버 변수들의 선언 순서와 자료형에 따라 메모리 공간의 크기 및 배치 방식이 달라집니다.
C 언어에서 <code>typedef struct</code>를 통해 정의된 구조체는 내부 멤버 변수들의 선언 순서와 자료형에 따라 메모리 공간의 크기 및 배치 방식이 달라집니다.<blockquote>기업 필기 테스트에서 자주 출제되는 주제입니다.</blockquote>==== 기본 타입별 크기 ====


> 기업 필기 테스트에서 자주 출제되는 주제입니다.
* <code>char</code> : 1바이트
* <code>int</code> : 4바이트
* <code>double</code> : 8바이트


<br>
<code>sizeof</code> 연산자를 통해 구조체 전체의 크기를 확인할 수 있습니다.


==== 기본 타입별 크기 ====
<nowiki>==== 예제 1: 기본 구조체 메모리 크기 ====</nowiki>
<code>typedef struct student {
    char a;
    int b;
} S;
int main() {
    printf("메모리 크기 = %d\n", sizeof(S)); // 출력: 8
    return 0;
}</code>


* `char` : 1바이트
* <code>char</code>는 1바이트, <code>int</code>는 4바이트이므로 단순 계산으로는 5바이트가 예상됩니다.
* `int` : 4바이트 
* 그러나 실제 출력값은 '''8바이트'''입니다.
* `double` : 8바이트


`sizeof` 연산자를 통해 구조체 전체의 크기를 확인할 수 있습니다.
<nowiki>'''''왜 그럴까요?'''''</nowiki>


<br>
<nowiki>==== 구조체 정렬 규칙 ====</nowiki>


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


```c
예제에서 <code>char a</code> 뒤에는 3바이트의 패딩이 삽입되어, <code>int b</code>가 4바이트 정렬 주소에 위치하게 됩니다.
typedef struct student {
    char a;
    int b;
} S;


int main() {
<nowiki>[[파일:Struct-align1.png|center|600px]]</nowiki>
    printf("메모리 크기 = %d\n", sizeof(S)); // 출력: 8
    return 0;
}
```


* `char`는 1바이트, `int`는 4바이트이므로 단순 계산으로는 5바이트가 예상됩니다.  
<nowiki>==== 예제 2: 연속된 char 변수 ====</nowiki>
* 그러나 실제 출력값은 **8바이트**입니다.
<code>typedef struct student {
    char a;
    char b;
    int c;
  } S;</code>


'''''왜 그럴까요?'''''
* <code>char a</code>와 <code>char b</code>는 하나의 4바이트 블록에 함께 배치됩니다.
* 이후 2바이트의 패딩이 추가되고, <code>int c</code>가 정렬된 위치에 배치됩니다.


<br>
<nowiki>[[파일:Struct-align2.png|center|600px]]</nowiki>
 
==== 구조체 정렬 규칙 ====
 
1. 각 멤버는 **자료형의 정렬 기준(alignment)**에 따라 메모리에 배치됩니다. 일반적으로 4바이트 단위로 정렬됩니다. 
2. 구조체 전체의 크기는 **가장 큰 멤버의 크기 배수**가 되도록 패딩(padding)됩니다.
 
예제에서 `char a` 뒤에는 3바이트의 패딩이 삽입되어, `int b`가 4바이트 정렬 주소에 위치하게 됩니다.
 
[[파일:Struct-align1.png|center|600px]]
 
<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바이트
→ 총 8바이트


<br>
<nowiki>==== 예제 3: 멤버 순서 변경 ====</nowiki>
 
<code>typedef struct student {
==== 예제 3: 멤버 순서 변경 ====
    char a;
    int c;
    char b;
} S;</code>


```c
* <code>char a</code> 뒤에 3바이트의 패딩이 삽입되고, <code>int c</code>가 정렬된 위치에 배치됩니다.
typedef struct student {
* <code>char b</code>는 다시 별도 4바이트 블록에 위치하며, 그 뒤에 3바이트 패딩이 붙습니다.
    char a;
    int c;
    char b;
} S;
```


* `char a` 뒤에 3바이트의 패딩이 삽입되고, `int c`가 정렬된 위치에 배치됩니다. 
<nowiki>[[파일:Struct-align3.png|center|600px]]</nowiki>
* `char b`는 다시 별도 4바이트 블록에 위치하며, 그 뒤에 3바이트 패딩이 붙습니다.
 
[[파일:Struct-align3.png|center|600px]]


→ 총 12바이트
→ 총 12바이트


<br>
<nowiki>==== 예제 4: double 포함 구조체 ====</nowiki>
<code>typedef struct student {
    char a;
    int c;
    double b;
} S;</code>


==== 예제 4: double 포함 구조체 ====
* <code>double</code>의 정렬 기준은 8바이트입니다.
 
```c
typedef struct student {
    char a;
    int c;
    double b;
} S;
```
 
* `double`의 정렬 기준은 8바이트입니다.
* 전체 구조체는 8바이트 단위 정렬을 따르며, 멤버들이 이에 맞게 배치되어 총 16바이트가 됩니다.
* 전체 구조체는 8바이트 단위 정렬을 따르며, 멤버들이 이에 맞게 배치되어 총 16바이트가 됩니다.


[[파일:Struct-align4.png|center|600px]]
<nowiki>[[파일:Struct-align4.png|center|600px]]</nowiki>
 
<br>


==== 정리 ====
<nowiki>==== 정리 ====</nowiki>


* 구조체의 메모리 크기는 멤버의 **자료형 크기와 정렬 기준**에 따라 달라집니다.
* 구조체의 메모리 크기는 멤버의 '''자료형 크기와 정렬 기준'''에 따라 달라집니다.
* 멤버의 **선언 순서**에 따라 불필요한 패딩이 생길 수 있으며, 이를 줄이기 위해 **작은 타입을 먼저 선언**하는 것이 유리합니다.
* 멤버의 '''선언 순서'''에 따라 불필요한 패딩이 생길 수 있으며, 이를 줄이기 위해 '''작은 타입을 먼저 선언'''하는 것이 유리합니다.


<br>
<nowiki>==== 참고자료 ====</nowiki>


==== 참고자료 ====
* 원문 블로그 보기


* [원문 블로그 보기](http://blog.naver.com/PostView.nhn?blogId=sharonichoya&logNo=220495444611)
*

2025년 4월 21일 (월) 14:14 판

=== C 언어 구조체 메모리 크기 (Struct Memory Size) ===

C 언어에서 typedef struct를 통해 정의된 구조체는 내부 멤버 변수들의 선언 순서와 자료형에 따라 메모리 공간의 크기 및 배치 방식이 달라집니다.

기업 필기 테스트에서 자주 출제되는 주제입니다.

==== 기본 타입별 크기 ====

  • char : 1바이트
  • int : 4바이트
  • double : 8바이트

sizeof 연산자를 통해 구조체 전체의 크기를 확인할 수 있습니다.

==== 예제 1: 기본 구조체 메모리 크기 ====

typedef struct student {
    char a;
    int b;
} S;

int main() {
    printf("메모리 크기 = %d\n", sizeof(S)); // 출력: 8
    return 0;
}
  • char는 1바이트, int는 4바이트이므로 단순 계산으로는 5바이트가 예상됩니다.
  • 그러나 실제 출력값은 8바이트입니다.

'''''왜 그럴까요?'''''

==== 구조체 정렬 규칙 ====

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

예제에서 char a 뒤에는 3바이트의 패딩이 삽입되어, int b가 4바이트 정렬 주소에 위치하게 됩니다.

[[파일:Struct-align1.png|center|600px]]

==== 예제 2: 연속된 char 변수 ====

typedef struct student {
    char a;
    char b;
    int c;
} S;
  • char achar b는 하나의 4바이트 블록에 함께 배치됩니다.
  • 이후 2바이트의 패딩이 추가되고, int c가 정렬된 위치에 배치됩니다.

[[파일:Struct-align2.png|center|600px]]

→ 총 8바이트

==== 예제 3: 멤버 순서 변경 ====

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바이트

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

typedef struct student {
    char a;
    int c;
    double b;
} S;
  • double의 정렬 기준은 8바이트입니다.
  • 전체 구조체는 8바이트 단위 정렬을 따르며, 멤버들이 이에 맞게 배치되어 총 16바이트가 됩니다.

[[파일:Struct-align4.png|center|600px]]

==== 정리 ====

  • 구조체의 메모리 크기는 멤버의 자료형 크기와 정렬 기준에 따라 달라집니다.
  • 멤버의 선언 순서에 따라 불필요한 패딩이 생길 수 있으며, 이를 줄이기 위해 작은 타입을 먼저 선언하는 것이 유리합니다.

==== 참고자료 ====

  • 원문 블로그 보기