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

ㅤ
오늘부터 프로젝트를 시작한다. 물론 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;
}
ㅤ
딥다이브
구조체의 메모리 관리
구조체가 메모리를 어떻게 점유할 지에 대해서는 몇 가지 규칙이 있음.
- 선언 때 작성한 멤버 순서대로 들어간다.
- 각 멤버는 자신의 크기의 배수에 해당하는 주소를 시작점으로 가진다.
- char 멤버 → 아무데나 배치 가능
- int 멤버 → 시작 주소가 4의 배수여야함
- double 멤버 → 시작 주소가 8의 배수여야함
- 가장 큰 타입의 멤버가 메모리 블럭 할당 단위가 된다.
- 그렇다고 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 보다 작은 자료형 모두) 필요한 만큼만 공간을 할당한다.
'TIL' 카테고리의 다른 글
| [250902] Day 23 - 이제 내 세상이다 (0) | 2025.09.04 |
|---|---|
| [250901] Day 22 - C언어도 캡슐화가 가능하다고 (0) | 2025.09.01 |
| [250824] Day 14 - 즐거운 주말 (0) | 2025.08.25 |
| [250822] Day 12 - 메모리 동적할당과의 한 판 승부 (0) | 2025.08.24 |
| [250821] Day 11 - C언어는 모든게 포인터인가요 (0) | 2025.08.22 |