211111, C언어 입문 day 14-2

Min Hyeok·2021년 11월 11일
0

C언어 개념 익히기

목록 보기
19/19

C언어로는 오랫만이다.

원래 19장 파일 입출력 함수는 그냥 읽어만 두고 나중에 직접 해볼 일이 있을때 다시 복습해가며 할려고 했는데, 자료구조에서 node, Linked List를 공부하고 C언어에서 공부한 내용이였어서 velog에 복습 일지를 쓰던 중 참고하려고 보니까, 복습을 안해놨더라.. 그래서 C언어 교재로 복습을 다시 한번하고, 자료구조책에서 복습을 하려고 한다 (내일).

18장 - 2

18-3

구조체를 사용하는 것이 왜 좋은지를 이해해보기 위해, 프로그램을 구조체로 만들어본다.

만약 전화번호부처럼 "친구 정보 관리 프로그램"을 만들어서 친구 추가할 때 "친구의 이름, 나이, 키, 몸무게"를 입력받는다고 치자.

만약 이걸 배열로 받으려면, 친구들의 이름, 나이, 키, 몸무게를 각각 다~ 1차원 배열을 받아서 코드를 짜야할거다.

#define MAX_COUNT	5; //친구는 다섯명
typedef char NAME_TYPE[14]; //이름은 14글자가 안넘음!

int main() {
    NAME_TYPE name[MAX_COUNT];
    unsigned short int age[MAX_COUNT];
    float height[MAX_COUNT];
    float weight[MAX_COUNT];
    .
    .
    .
}

어우, 너무 귀찮다. 각 배열마다 다 값을 넣어줘야 하니까, 얼마나 귀찮겠냐..

근데 이걸, 구조체로 써준다면?

#define MAX_COUNT 5;

typedef struct friends {
    char name[14];
    unsigned short int age;
    float weight;
    float height;
} Person; //구조체 Person 정의

.
.
.

void main() {
    Person friends[MAX_COUNT];
}

아까 1차원 배열 네개가 주르륵 있던게 구조체 하나로 깔끔해졌다.

18-4

구조체는 위에서 예시로 보듯 다양한 자료형(크기)의 메모리를 한 그룹으로 묶다보니, 실행속도가 떨어지는 문제가 있다. 그래서 C 컴파일러가 알아서 구조체 요소를 일정한 크기르 정렬해서 실행 속도를 더 빠르게 하는 개념이 추가 되었다.

이게 "구조체 멤버 정렬" 이라는 것임.

지금부터 여러가지 구조체 멤버 정렬에 대해서 설명할건데,

struct Test {
    char a;
    int b;
    short c;
    char d;
}

이렇게 Test 구조체 하나를 선언해서 예시를 쭉 들겠다.

1. 1Byte 정렬

그냥 Test 구조체를 보면 1 + 4 + 2 + 1 = 8. 8Byte다. 그냥 그렇게 생각하면 된다.

2. 2Byte 정렬

각 요소가 2의 배수에 해당하는 주소에서 시작할 수 있고, 전체 크기가 2의 배수가 되어야 한다.

만약 요소가 놓일 주소가 2의 배수가 아니다? 그 1바이트를 버리고, 2의 배수가 되는 주소에 놓는다.

BUT 요소의 자료형이 2바이트보다 작으면 그냥 해당 요소 크기대로 고대로 정렬된다.

위의 Test 구조체를 예로 들면

이렇게 된다.

3. 4Byte 정렬.

각 요소가 4의 배수에 해당하는 주소에서 시작할 수 있고, 전체 크기가 4의 배수가 되어야 한다.

만약 요소가 놓일 주소가 4의 배수가 아니면 1~3바이트를 버리고, 4의 배수가 되는 주소에 놓는다.

BUT 요소의 자료형이 4보다 작으면 고대로 놓는다.

이것도 예로 들면

요렇다.

4. 8Byte 정렬.

이건 Test 구조체를 좀 수정을 하겠다.

struct Test {
    char a;
    double b;
    short c;
    char d;
}

모든 요소가 정렬 기준 바이트보다 작으면 그냥 가장 큰 요소 크기를 따라서 결정된다. 그래서 int형을 double형(8Byte)로 바꿔줬다.

그냥 위에서 말한것들 숫자만 8로 바꿔라..

그리고, 구조체로 자료형을 선언할 때 같은 크기의 요소들끼리 모아주는 것 만 잘해도 프로그램 효율을 크게 높인다.

바로 위의 Test 구조체를 8바이트로 정렬한 24바이트짜리 저 그림을 한번 같은 크기의 요소만 모아보자

struct Test {
    char a;
    char d;
    short c;
    double b;
}

그저 요소 순서만 바꿔준건데, 8바이트를 아끼게 되었다.

만약 구조체 요소가 어마무시하게 많다면, 훨씬 많이 아꼈겠지..?

내일은 본격적으로 연결 리스트 복습을 시작하겠다.

여기까지.

0개의 댓글