본문 바로가기
프로그래밍 언어/c(임베디드)

구조체 & 공용체 [1]

by [Akashic Records] 개발의선지자 2024. 7. 18.

※ 해당 글은 개인 공부 기록을 남겨놓는 것이 목적임으로 오류가 발생할수 있습니다.

    오류 또는 업데이트된 사항이 있다면 댓글로 알려주시면 감사하겠습니다.

구조체란?

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