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

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


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


* <code>char</code> : 1바이트
기업의 필기 테스트나 면접에서 자주 출제되는 유형이므로 반드시 이해하고 숙지할 필요가 있다.
* <code>int</code> : 4바이트
* <code>double</code> : 8바이트


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


<nowiki>==== 예제 1: 기본 구조체 메모리 크기 ====</nowiki>
C언어에서 자주 사용하는 기본 자료형과 그 크기는 다음과 같다.
<code>typedef struct student {
    char a;
    int b;
} S;
int main() {
    printf("메모리 크기 = %d\n", sizeof(S)); // 출력: 8
    return 0;
}</code>


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


<nowiki>'''''왜 그럴까요?'''''</nowiki>
'''int''' : 4바이트


<nowiki>==== 구조체 정렬 규칙 ====</nowiki>
'''double''' : 8바이트


# 멤버는 **자료형의 정렬 기준(alignment)**에 따라 메모리에 배치됩니다. 일반적으로 4바이트 단위로 정렬됩니다.
변수나 자료형의 크기는 sizeof 연산자를 통해 쉽게 확인할 수 있다.
# 구조체 전체의 크기는 '''가장 큰 멤버의 크기 배수'''가 되도록 패딩(padding)됩니다.


예제에서 <code>char a</code> 뒤에는 3바이트의 패딩이 삽입되어, <code>int b</code>가 4바이트 정렬 주소에 위치하게 됩니다.
=== 구조체 메모리 크기 계산 규칙 ===


<nowiki>[[파일:Struct-align1.png|center|600px]]</nowiki>
구조체가 메모리를 할당할 때는 다음 두 가지 중요한 규칙이 적용된다.


<nowiki>==== 예제 2: 연속된 char 변수 ====</nowiki>
'''가장 큰 크기를 가진 멤버의 자료형을 기준으로 메모리 공간을 할당'''한다.
<code>typedef struct student {
    char a;
    char b;
    int c;
} S;</code>


* <code>char a</code>와 <code>char b</code>는 하나의 4바이트 블록에 함께 배치됩니다.
구조체의 전체 크기는 '''가장 큰 자료형의 배수'''가 되어야 하며, 이를 위해 남는 공간은 여유 공간(padding)으로 채워진다.
* 이후 2바이트의 패딩이 추가되고, <code>int c</code>가 정렬된 위치에 배치됩니다.


<nowiki>[[파일:Struct-align2.png|center|600px]]</nowiki>
==== 예시를 통한 이해 ====


→ 총 8바이트
다음 예시들을 통해 보다 쉽게 이해해 보자.


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


* <code>char a</code> 뒤에 3바이트의 패딩이 삽입되고, <code>int c</code>가 정렬된 위치에 배치됩니다.
int main() {
* <code>char b</code>는 다시 별도 4바이트 블록에 위치하며, 그 뒤에 3바이트 패딩이 붙습니다.
printf("메모리 크기 = %d\n", sizeof(S)); // 출력: 8
return 0;
}


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


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


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


* <code>double</code>의 정렬 기준은 8바이트입니다.
이 경우에도 총 8바이트가 할당된다. char 멤버 두 개(a와 b)는 한 번에 4바이트 공간에 배치되고, 나머지 2바이트는 여유 공간으로 처리된다.
* 전체 구조체는 8바이트 단위 정렬을 따르며, 멤버들이 이에 맞게 배치되어 총 16바이트가 됩니다.


<nowiki>[[파일:Struct-align4.png|center|600px]]</nowiki>
==== 예시 3 (멤버 선언 순서에 따른 차이) ====


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


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


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


* 원문 블로그 보기
=== 구조체 사용 시 주의사항 ===


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

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바이트가 구조체에 할당된다.

구조체 사용 시 주의사항

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