서울42 본과정을 진행하면서 항상 궁금했던 토픽... 면접 준비를 하며 그 이유를 알게돼서 오늘은 구조체를 선언할 때 왜 크기가 작은 변수부터 선언해야 하는지에 대해 다룰겁니다.
구조체 선언할 때 왜 크기 작은 변수부터 선언하라고 할까?
이 주제를 설명하기에 앞서 자료형에 대해 정리해봅시다.
char
: 1byteint
: 4bytedouble
: 8byte그리고 자료형의 크기를 계산할 수 있는 함수 sizeof()
가 있습니다. 이 함수로 구조체의 크기를 확인해 보겠습니다.
typedef struct{
char a;
int b;
}S;
int main()
{
printf("구조체 크기 : %d\n", sizeof(S));
}
이런 구조체를 sizeof()
의 인자로 사용했을 때 char는 1byte이고 int는 4byte니 결과는 5byte일까요?
아쉽게도 이 문제의 답은 8byte입니다.
구조체가 메모리를 잡는 방법은 두가지가 있습니다.
그림으로 볼까요?
방금 본 구조체는 이런 형태로 저장돼 있게 됩니다. 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를 갖게 됩니다.
구성은 같은데 순서가 다르다는 이유로 메모리 낭비가 발생할 수 있습니다. 여기서 오늘 주제의 답이 나왔네요.
구조체를 선언할 때 왜 크기 작은 변수부터 선언하라고 할까요? 바로 이런 메모리 낭비를 막기 위해서입니다. 같은 자료형을 연속해서 선언해야 불필요한 메모리의 사용을 줄일 수 있습니다.