구조체 선언과 멤버 변수
Intro
이 글은 구조체에 대해서 다룹니다.
구조체란?
다른 형태의 데이터를 하나로 묶어 데이터를 효율적으로 처리할 수 있는 것이 바로 구조체이다.
사용자가 만드는 자료형이다.
구조체 선언
구조체를 선언하는 방식은 다음과 같다.
struct student
{
int num;
double grade;
};
구조체는 struct 예약어로 선언된다.
그리고 구조체 이름을 명시하고
블록 안에 구조체 안에서 사용될 변수를 정의한다.
이 때 블록 뒤에 세미콜론을 반드시 붙여야 한다는 것을 명심하자.
구조체 변수 선언
위에서 선언한 구조체 형식을 바탕으로 구조체 변수를 선언할 수 있다.
struct student s1;
구조체 변수를 선언하면 비로소 저장 공간이 할당된다.
각 멤버의 공간이 메모리에 연속으로 할당되며 모든 변수를 더한 전체 공간이
하나의 구조체 변수가 된다.
따라서 구조체 변수의 크기는 각 멤버변수의 크기를 합한 것이 된다.
구조체 변수 멤버 접근법
구조체 변수는 그 안에 여러 타입의 변수를 가지고 있으므로
이 변수의 값을 선언하거나 변경하려면 여기에 접근할 수 있는 방법이 있어야 한다.
이 방법이 바로 ‘멤버 접근 연산자’인 “.”이다.
예시는 다음과 같다.
s1.num = 2;
s1.grade = 2.7;
패딩 바이트 & 바이트 얼라인먼트
모든 시스템은 데이터를 빠르게 읽고 처리하기 위해
“일정한” 크기 단위로 메모리에 접근한다.
컴파일러는 구조체 멤버의 크기가 너무 다를 경우 멤버 사이에 ‘패딩바이트(padding byte)’를 넣어
멤버를 가지런하게 정렬한다.
이것을 ‘바이트 얼라인먼트(byte alignment)’라고 한다.
구조체 변수의 크기는 바이트 얼라이먼트로 인해 시스템마다 다를 수 있다.
struct student 구조체는 grade 멤버의 크기가 가장 크므로 8바이트가 기준 단위가 된다.
결국 패딩 바이트에 의해 메모리가 낭비되는 측면이 있을 수 있기 때문에
패딩바이트가 가장 작도록 구조체를 선언하면 메모리를 아낄 수 있다.
그리고 다음과 같은 선언을 통해서 컴파일러에게 패딩 바이트를 넣지 않도록 지시할 수 있다.
#pragma pack(1);