왜 크기 작은 변수부터 선언하라고 할까?

ppparkta·2022년 9월 9일
1

서울42 본과정을 진행하면서 항상 궁금했던 토픽... 면접 준비를 하며 그 이유를 알게돼서 오늘은 구조체를 선언할 때 왜 크기가 작은 변수부터 선언해야 하는지에 대해 다룰겁니다.

구조체의 크기

구조체 선언할 때 왜 크기 작은 변수부터 선언하라고 할까?

이 주제를 설명하기에 앞서 자료형에 대해 정리해봅시다.

  • char : 1byte
  • int : 4byte
  • double : 8byte

그리고 자료형의 크기를 계산할 수 있는 함수 sizeof() 가 있습니다. 이 함수로 구조체의 크기를 확인해 보겠습니다.

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

int main()
{
	printf("구조체 크기 : %d\n", sizeof(S));
}

이런 구조체를 sizeof()의 인자로 사용했을 때 char는 1byte이고 int는 4byte니 결과는 5byte일까요?

아쉽게도 이 문제의 답은 8byte입니다.

구조체의 메모리

구조체가 메모리를 잡는 방법은 두가지가 있습니다.

  • 기본 4byte 단위로 잡힌다 (문제의 답이 8byte인 이유입니다. 1byte인 char도 4byte의 메모리로 잡힌거죠)
  • 구조체 각 멤버 중 가장 큰 멤버의 크기에 영향을 받는다

그림으로 볼까요?

방금 본 구조체는 이런 형태로 저장돼 있게 됩니다. char는 1byte지만 메모리는 4byte를 사용하고 있으므로 실제로는 3byte가 놀고 있는 상태가 됩니다.


그렇다면 이 경우는 어떨까요?

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

이 문제의 답도 8byte입니다.

놀고있던 3byte 자리에 하나의 자료가 추가되면서 똑같이 8byte의 크기를 갖게 되며 놀고 있는 메모리는 2byte가 됩니다.


조금 더 나아가서 이 경우는 어떨까요?

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

아까와 같이 8byte가 정답일까요? 이 경우는 조금 다릅니다. 답을 보기 전에 그림부터 볼까요?

구조체 내에서 자료형 순서를 혼동해서 선언하면 이런 상태가 됩니다. 이 구조체는 12byte를 갖게 됩니다.

구성은 같은데 순서가 다르다는 이유로 메모리 낭비가 발생할 수 있습니다. 여기서 오늘 주제의 답이 나왔네요.

결론

구조체를 선언할 때 왜 크기 작은 변수부터 선언하라고 할까요? 바로 이런 메모리 낭비를 막기 위해서입니다. 같은 자료형을 연속해서 선언해야 불필요한 메모리의 사용을 줄일 수 있습니다.

profile
겉촉속촉

0개의 댓글