※ 해당 글은 개인 공부 기록을 남겨놓는 것이 목적임으로 오류가 발생할수 있습니다.
오류 또는 업데이트된 사항이 있다면 댓글로 알려주시면 감사하겠습니다.
구조체란?
C언어의 기본 타입을 가지고 새롭게 정의할 수 있는 사용자 정의 타입입니다
구조체는 관련 정보를 하나의 의미로 묶을 때 사용합니다. 특히 목적에 맞는 자료형을 만들어서 사용하는데 기본 자료형을 조합하여 만든 자료형을 파생형(derived type)이라 한다.
선언 방법
struct 구조체이름
{
멤버변수1의타입 멤버변수1의이름;
멤버변수2의타입 멤버변수2의이름;
...
};
익명 구조체
typedef struct 구조체이름
{
멤버변수1의타입 멤버변수1의이름;
멤버변수2의타입 멤버변수2의이름;
...
}구조체의새로운이름;
구조체 선언 예시
//1. 구조체 변수 선언
//2. typedef 지시자로 struct 키워드 없이 구조체 선언
#include <stdio.h>
struct Person{
char name[20];
int age;
char address[100];
};
typedef struct _Book {
char name[20]; // 이름
int page; // 나이
int price; // 주소
}Book; // typedef를 사용하여 구조체 별칭을 Book으로 정의
int main{
struct Person p1;
Book b1;
return 0;
}
공용체란?
공용체는 순서가 규칙적이지 않고, 미리 알 수 없는 다양한 타입의 데이터를 저장할 수 있도록 설계된 타입입니다.
선언 방법
union 공용체이름 {
자료형 멤버이름;
};
익명 공용체
typedef union {
자료형 멤버이름;
} 공용체의새로운이름;
공용체 선언 예시
#include <stdio.h>
//1. 공용체 변수 선언
//2. typedef 지시자로 union 키워드 없이 공용체 선언
union Box {
short candy; //2byte
float snack; //4byte
char doll[16] //16byte
};
typedef union
{
unsigned char a;
unsigned short b;
unsigned int c;
} SHAREDATA; // typedef를 사용하여 공용체 별칭을 SHAREDATA으로 정의
int main{
union Box b1;
SHAREDATA var;
return 0;
}
구조체와 공용체 차이
구조체는 가장 크기가 큰 변수 크기 값을 기준으로 하여 나머지 변수들을 순서대로 배치. 따라서 각 구조체 멤버들의 시작주소는 다르다
공용체는 크기가 가장 큰 멤버 변수의 크기로 메모리를 할당받고 나머지 변수들이 메모리를 공유합니다. 따라서 각 공용체 멤버들의 시작 주소는 동일합니다. 따라서 공용체는 한 번에 하나의 멤버 변수밖에 사용할 수 없다.
공용체 배열을 사용하면, 같은 크기로 구성된 배열 요소에 다양한 크기의 데이터를 저장할 수 있습니다.
구조체 바이트 패딩(Struct Byte Padding)이란?
32bits OS는 4bytes 단위, 64bits OS는 8bytes 단위로 메모리를 읽는다.
내용이 잘려서 두번 읽는 것을 방지하기 위해 4Byte 단위로 정렬을 위해 적절한 빈공간을 두는 걸 Padding이라 한다.
Byte Padding 이란 멤버 변수를 메모리에서 CPU로 읽을 때 한번에 읽을 수 있도록, 컴파일러가 레지스터의 블록에 맞춰 바이트를 패딩해주는 최적화 작업
-> 컴파일러가 패딩을 하지 않는다면(=최적화를 해주지 않는다면)
CPU가 메모리에 다시 접근하면서 성능이 떨어질 것이다.
컴파일러는 구조체를 구성하는 멤버들을 가장 크기가 큰 멤버 자료형의 배수가 되도록 정렬한다.
컴파일러에게 바이트 패딩을 적용하지 않도록 지시하는 명령어 : #pragma pack(1)
컴파일러에게 바이트 패딩을 적용 하도록 지시하는 명령어 #pragma pack(4)
출처 : 코딩 도장
'프로그래밍 언어 > c(임베디드)' 카테고리의 다른 글
Wiegand 통신 (0) | 2024.09.08 |
---|---|
가변인자 함수 + 디버깅 매크로 (0) | 2024.08.16 |
LSM/MSB , 리틀 엔디안 / 빅 엔디안 (0) | 2024.07.16 |
while문 사용법 (0) | 2024.07.13 |
비트 마스크 (0) | 2024.05.22 |