Computer Science
탄탄한 기반 실력을 위한
전공과 이론 지식 모음
Today I Learned!
배웠으면 기록을 해야지
TIL 사진
Flutter 사진
Flutter로 모바일까지
거꾸로캠퍼스 코딩랩 Flutter 앱개발 강사
스파르타코딩클럽 즉문즉답 튜터
카카오테크캠퍼스 3기 학습코치
프로필 사진
박성민
임베디드 세계에
발을 들인 박치기 공룡
임베디드 사진
EMBEDDED SYSTEM
임베디드 SW와 HW, 이론부터 실전까지
ALGORITHM
알고리즘 해결 전략 기록
🎓
중앙대학교 소프트웨어학부
텔레칩스 차량용 임베디드 스쿨 3기
애플 개발자 아카데미 1기
깃허브 사진
GitHub
프로젝트 모아보기
Instagram
인스타그램 사진

TIL

[250825] Day 15 - 드디어 프로젝트를 시작합니다!

sm_amoled 2025. 8. 25. 22:53

들어가며

퍼플렉시티가 추천해주는 블로그, 레드의 노트!

오늘부터 프로젝트를 시작한다. 물론 C언어로 진행되는 되게 간단한 프로젝트이긴 한데, 처음 보는 라이브러리를 활용해서 C언어로 개발을 해야하고, 콜리전 같은 복잡한 연산이 되게 많이 등장하는 프로젝트라서 이게 쉽게 볼 일은 아닌 것 같은데, 괜찮을 지 고민이다.

이번 프로젝트의 목적이 나는 “C언어로 진행되는 프로젝트로 구현 감 키우기” 라고 생각해서, 완전히 화려하고 스펙타클한 게임을 만들기보다는 팀원들이 자신의 몫을 계속 설계하고 직접 구현해보는 것을 도와주는 것을 목표로 하려고 한다. 뭔가 발표에서도 우리가 연습하려고 했던 것들 + 배우려고 노력한 내용들을 조금 더 강조하면 좋은 포인트가 되지 않을까 기대되긴 한다. 호호…

지금 생각은 구글의 할로윈 고양이 게임을 한 번 만들어보는거고, 잘 될지는 노력해봐야겠지만,,, 아마 잘 될 것 같다 ^,^

오늘의 키워드

구조체의 초기화

// 일반적으로 타입은 이렇게 선언함.
// 특히 struct의 이름은 _name 으로 짓고, 
// 타입의 이름은 _t 를 뒤에 붙여서 타입임을 명시.
typedef struct _name {
    int num;
    double grade;
    _name* to_name;
} name_t;

// 초기값은 이렇게 넣어줌
name_t me = { 32, 14.5, NULL }; 

// 이렇게 다시 값을 넣는건 안됨
me = { 32, 14.5, NULL }; 

// 근데 타입을 알려주면 가능함
me = (name_t){ 32, 14.5, NULL }; 

비트필드 구조체

비트필드 구조체를 사용할 때는 구조체 멤버 변수를 사용할 때 처럼 간단히 점 찍어서 접근하면 됨.

그러나, 내부적으로는 이걸 bit 연산을 통해 만들기 때문에 성능 자체는 그렇게 좋지 않다. (바로 접근이 아니라 연산이 필요함)

struct bit {
    unsigned int a : 3;
    unsigned int b : 3;
    unsigned int c : 3;
}x;

int main(void) {
    x.a = 2;
    x.b = 1;
    x.c = 5;

    // 이렇게 char로 byte 단위로 쪼개서 읽어오기 가능함
    printf("%x\n", *(char*)&x);
    printf("%x\n", *((char*)&x + 1));

    // 이렇게 하면 전체 접근
    printf("%x\n", x);
    printf("%d\n", sizeof(x));
    return 0;
}

딥다이브

구조체의 메모리 관리

구조체가 메모리를 어떻게 점유할 지에 대해서는 몇 가지 규칙이 있음.

  1. 선언 때 작성한 멤버 순서대로 들어간다.
  2. 각 멤버는 자신의 크기의 배수에 해당하는 주소를 시작점으로 가진다.
    • char 멤버 → 아무데나 배치 가능
    • int 멤버 → 시작 주소가 4의 배수여야함
    • double 멤버 → 시작 주소가 8의 배수여야함
  3. 가장 큰 타입의 멤버가 메모리 블럭 할당 단위가 된다.
    • 그렇다고 40byte 구조체를 멤버로 가진다고 40byte가 기본 단위가 되지는 않음.
    • 그냥 primitive 타입만 해당되는거라고 생각해도 될 것 같음.
    • 근데 그것도 현재 구조체의 primitive 타입이 기준이 아니라, 하위 모든 데이터의 타입에 대해 따지는 것으로 보인다.

단순히 char 만 사용한 경우

struct In {
    char a;
    char b;
    char c;
};
struct Out {
    char v1;
    struct In in;
    char v2;
    char v3;
};

// sizeof(Out) : 6
주소:  0  1  2  3  4  5
     [v1][a][b][c][v2][v3]
      ↑  ←-In구조체-→ ↑  ↑
    Out시작        Out멤버들

내부 구조체에 사이즈가 4인 int를 사용하는 경우


struct In {
    int a;
    int b;
    int c;
};
struct Out {
    char v1;
    struct In in;
    char v2;
    char v3;
};

// sizeof(Out) : 20
주소:  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19
     [v1][P][P][P][====a====][====b====][====c====][v2][v3][P][P]
      ↑  ←패딩→ ←---------In구조체(12바이트)--------→ ↑  ↑ ←패딩→
    Out시작                                      Out멤버들

내부 구조체에 사이즈가 8인 double을 사용하는 경우

struct In {
    int a;
    int b;
    double c;
};
struct Out {
    char v1;
    struct In in;
    char v2;
    char v3;
};

// sizeof(Out) : 32
이건 double 을 기준으로 alignment가 맞춰지는 듯 보임.

char, short, char[] 종류 중 하나의 자료형으로만 데이터를 구성해 구조체를 사용하는 경우 (int 보다 작은 자료형 모두) 필요한 만큼만 공간을 할당한다.

320x100