[C] 구조체로 만들어지는 자료형의 크기

김태희·2023년 11월 18일
0
post-thumbnail

구조체로 만들어지는 자료형의 크기

과거에는 컴퓨터 시스템의 메모리 용량이 적어 메모리를 최대한 적게 사용하였다.

하지만 최근에는 메모리 용량이 늘어나면서 메모리를 조금 더 사용하더라도 프로그램의 실행 속도가 향상되도록 프로그램을 개발하고 있다.

구조체의 경우에도 다양한 크기의 메모리를 하나로 묶다보니 실행 속도가 떨어지는 문제가 있어
C 컴파일러에는 구조체의 요소를 일정한 크기로 정렬하여 실행 속도를 더 빠르게 하는 개념이 추가되었다.

이 개념으로 인해 단순히 구조체의 요소들을 합산하여 구조체의 크기로 사용하다가는 버그가 발생할 수 있다.

구조체의 메모리 정렬 방법

struct Test{
 char a; /*1byte*/
 int b; /*4byte*/
 short c; /*2byte*/
 char d; /*1byte*/
}

"bbbb" == b가 4바이트를 차지
"-" == 버려지는 공간

1byte 정렬
본래의 의미대로 메모리가 구성

메모리 구성
a/b/b/b/b/c/c/d
Test 자료형의 크기는 8byte

2byte 정렬
전체 크기가 2의 배수가 되어야하고 2의 배수에 해당하는 주소에서만 요소가 시작될 수 있음

메모리 구성
a-/bb/bb/cc/d-
Test 자료형의 크기는 10byte

4byte 정렬
전체 크기가 4의 배수가 되어야하고 4의 배수에 해당하는 주소에서만 요소가 시작될 수 있음

메모리 구성
a----/bbbb/ccd-
Test 자료형의 크기는 12byte

8byte 정렬
전체 크기가 8의 배수가 되어야하고 8의 배수에 해당하는 주소에서만 요소가 시작될 수 있음

메모리 구성
a-------/bbbbccd-
Test 자료형의 크기는 16byte



빠른 실행 속도를 위한 정렬 방법

버려지는 공간이 많음에도 요즘 컴파일러들은 8byte 정렬을 기본 값으로 한다.

이러한 사실을 알고, 구조체의 요소를 같은 크기끼리 모아준다면 버려지는 공간을 줄일 수 있다 !



구조체를 효율적으로 사용하는 방법

구조체를 아래 형태로 수정한다면

struct Test{
 char a; /*1byte*/
 char d; /*1byte*/
 short c; /*2byte*/
 int b; /*4byte*/
}

8byte 정렬에서 메모리 구조가
adccbbbb/ 와 같이 되기 때문에
낭비되던 공간을 줄여 기존의
a-------/bbbbccd- 에 비해
8byte나 아낄 수 있게 된다


구조체의 크기를 계산할때 유의할 점

또한 이러한 오류를 방지하고자 직접 구조체의 크기를 계산하기 보단

sizeof(struct Test) 와 같이 sizeof 연산자를 사용하는 것이 안전하다

0개의 댓글