Data Alignment
만약
struct Student{
int a;
char b[6];
int c;
}
이러한 구조체가 있을 때 이 구조체의 크기는 몇일까?
단순히 생각해보면 int형은 4byte char형은 1byte니까 int형 2개 char형은 6개 있으니까 14byte라고 생각할 수 있다.
하지만 이 구조체는 16byte 이다.!!!
왜 그런지 다음과 같은 설명을 들어보자!
먼저 구조체를 이용하여 새로운 자료형을 정의하여 사용할 때, 정의된 자료형은 컴파일러에 의해 데이터로 변환되고, 이어서 메모리에 저장된다.
그래서 컴퓨터 프로세서가 메모리에 어떤 방식으로 접근하여 데이터를 읽어가고, 컴파일러가 프로그램 코드를 어떤 규칙으로 데이터를 변환하는지를 확인해야한다.
프로세서의 메모리 접근방식
32비트 프로세서 컴퓨터에서 메모리에 데이터를 쓰거나, 읽을 때는 4바이트 (1워드) 단위로 접근하여 명령을 수행한다.
프로세서는 한번에 4바이트씩 메모리에 접근하여 데이터를 읽어오는데 이와 같은 데이터를 프로세서의 접근 방식에 맞추어 데이터를 메모리에 정렬하면 프로세서의 접근 횟수를 줄여 처리속도를 향상시킬 수 있을 것이다.
효율적으로 맞출려면 4바이트(1워드)의 배수 크기로 맞추면 좋다.
하지만, 구조체 전체크기를 1워드의 배수로 맞추었음에도 실제로 디버깅 시 구조체의 크기가 4바이트의 배수가 아닌 경우도 있다.
컴파일러가 컴퓨터 메모리에 데이터를 저장할 떄 정렬하는 '규칙' 또는 '방식'이 있다.
그 규칙을 맞추기 위해 컴파일러는 의미없는 데이터를 추가한다. 이런 의미 없는 데이터를 패딩(Padding) 데이터라고 한다.
규칙1. 구조체의 크기는 구조체 내 자료형 중, 가장 크기가 큰 자료형의 배수가 된다.
예를 들어
int a,
short b,
char c
라는 구조체가 있으면 제일 큰 int형 변수의 크기로 배수가 정해지는 것이다.
그러면 실제로는 7byte만 사용하였지만 최종 결과는 8byte가 사용된 것이다.
그림으로 봐보자
이러한 형태가 되어 있다.
제일 큰 int형의 배수로 맞춰지고, short는 int 옆에 char형은 4의 배수의 2바이트 안에 들어 갈 수 있고, 나머지는 의미없는 데이터가 채워지는 형태이다.
그래서 메모리를 잘 정렬하면 처리속도가 더 빠르고, 효율적으로 메모리를 사용하는 자료형을 구성할 수 있다.!!